了解 JavaScript 闭包 - 冻结传递给回调的变量

2024-04-09

我对 JavaScript 闭包还没有基本的了解;

我有一个关于具体情况的问题,这也许也是基本和常见的例子:

3 秒内从 1 数到 3

请参阅此处的 JSFiddle:http://jsfiddle.net/nAh8x/ http://jsfiddle.net/nAh8x/

代码:

var i,
    t;

t = 0;

// Case A

for( i=1; i<=3; i++ ) {
    setTimeout( function() { log(i); }, t );
    t += 1000;
}

// Case B

for( i=1; i<=3; i++ ) {
    setTimeout( wrapper(i), t );
    t += 1000;
}

function wrapper(i) {
    return function() { log(i); };
}

// Log utility function

function log(msg) {
    $('#log').append( msg + '<br />' );
}

Case A不起作用。

我很清楚为什么:每次里面的函数设置超时时间被调用并访问i变量,其值已经达到4。

Case B works.

When 包装纸(一)被称为它返回

function() { log(i); };

上面的返回值(一个函数)就是 setTimeout 内部的内容。 setTimeout里面的内容和Case一模一样A

但这一次,i变量已被“冻结”为调用时的值。

为什么使用wrapper函数让传递的值被冻结?

我并不完全清楚。


闭包是通过调用外部函数使用变量作用域和嵌套函数创建的环境,

每次wrapper()被调用将会为下面的函数创建每个不同的环境

function wrapper(i) {
    return function() { log(i); };
}

这里是i的值将与当wrapper()被调用。每次i对于通过调用创建的特定环境,其值将是私有的wrapper()外函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 JavaScript 闭包 - 冻结传递给回调的变量 的相关文章

随机推荐