闭包
2019-04-30 本文已影响0人
Mr君
首先,参考下面2段代码
for (var i=1; i<=5; i++) {
(function() {
setTimeout( function timer() {
console.log( i );
}, i*1000 );
})();
}

for (var i=1; i<=5; i++) {
(function(j) {
setTimeout( function timer() {
console.log( j );
}, j*1000 );
})( i );
}

解释:
其实第一种写法等同于
for (var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log( i );
}, i*1000 );
}
即使创建一个立即执行的匿名函数,要考虑到timer函数执行过程是调用i
是for循环中的i
,而方法二其实相当于对i
通过变量j
进行保存,每次迭代都 创建出一个新的作用域,使得setTimeout的回调函数将新的作用域封闭在每个迭代的内部,每个迭代中都会产生一个具有正确值的变量提供我们访问。
小结
当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。
参考
《你不知道的JavaScript(上卷)》