我对 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(使用前将#替换为@)