返回

105-js循环和闭包示例

发布时间:2022-10-25 10:39:47 1974

代码1:

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

正常情况下,我们对这段代码行为的预期是分别输出数字1~5,每秒一次,每次一个。
但实际上,这段代码在运行时会以每秒一次的频率输出五次6。

代码2:

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

结果还是: 以每秒一次的频率输出五次6。
代码3:

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

结果就正常了:分别输出数字1~5,每秒一次,每次一个

代码4(改进):

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

代码4(再改进):

        for (var i=1; i<=5; i++) {
            let j = i; // 是的,闭包的块作用域!
            setTimeout( function timer() {
              console.log(j);
            }, j*1000 );
        }

代码5(再改进):

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

说明:
let声明,可以用来劫持块作用域,并且在这个块作用域中声明一个变量。

块作用域和闭包联手便可天下无敌

知识点来源:

《你不知道的JavaScript(上卷)》,5.4 循环和闭包

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线