闭包

2019-04-30  本文已影响0人  Mr君

首先,参考下面2段代码

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

解释:
其实第一种写法等同于

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

即使创建一个立即执行的匿名函数,要考虑到timer函数执行过程是调用i是for循环中的i,而方法二其实相当于对i通过变量j进行保存,每次迭代都 创建出一个新的作用域,使得setTimeout的回调函数将新的作用域封闭在每个迭代的内部,每个迭代中都会产生一个具有正确值的变量提供我们访问。

小结

当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。

参考
《你不知道的JavaScript(上卷)》

上一篇 下一篇

猜你喜欢

热点阅读