let 与 闭包

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

相信js新手们应该都写过类似的代码.在经过一番百度后,终于知道导致错误的原因是因为匿名函数中的变量引用的是同一个变量,所以结果显示相同.

解决这个问题的方法是使用闭包,创建一个新的作用域,代码会变成如下:

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

因为每次循环都会创新的作用域,每个i都是引用的自己作用域的变量,所以结果正常.
ES6引入了let变量声明,for循环头部的let声明还有一个特殊的行为:

这个行为指出变量在循环过程中不止被声明一次,每次迭代都会被声明.随后的每个迭代都会使用上一个迭代结束时的值来初始化这个变量.
所以我们的代码变成如下:

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

结果和预计一样.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 6,794评论 0 21
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,721评论 0 13
  • let 命令 块级作用域 const 命令 顶层对象的属性 global 对象 let 命令 基本用法 ES6 新...
    嘉奇呦_nice阅读 5,540评论 0 2
  • 西奥和梅林卡释放了白羊城的火之气息收集到了圣水之珠。 一道蓝色的海浪把 西奥和梅林卡 冲上...
    张榕柏燚阅读 2,953评论 1 1
  • 现在不再有精力熬夜了,头天晚上睡的太晚的话,第二天就会恍恍惚惚,没有精神,当然就干不好工作。所以,对抗失眠是我要首...
    如释笔记阅读 1,810评论 0 0

友情链接更多精彩内容