for循环中的闭包题目

for轮回:

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

/* 控制台打印:
    6
    6
    6
    6
    6
    6
 */
    

然则我们愿望的结果是:

1
2
3
4
5

缘由是,耽误函数的回调会在轮回完毕时才实行。当定时器运行时纵然每一个迭代中实行的是setTimeout(.., 0),一切的回调函数依然是在轮回完毕后才会被实行,因此会每次输出一个6 出来。

我们改写一下:

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

缘由:假如作用域是空的,那末仅仅将它们举行关闭是不够的。它须要包括一点本质内容才能为我们所用。它须要有本身的变量,用来在每一个迭代中贮存i 的值:

继承改写:

 for (var i=1; i<=5; i++) {
    (function() {
        var j = i;//保留外部变量
        setTimeout( function timer() {
            console.log( j );
        }, j*1000 );
    })();
}
/*
    1
    2
    3
    4
    5
*/
//代码革新:(将i当参数传进去)
 for (var i=1; i<=5; i++) {
    (function(j) {
        setTimeout( function timer() {
            console.log( j );
        }, j*1000 );
    })( i );
}

总结

当函数能够记着并接见地点的词法作用域,纵然函数是在当前词法作用域以外实行,这时候
就产生了闭包。
    原文作者:平平不平
    原文地址: https://segmentfault.com/a/1190000012977145
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞