javascript - 关于 let 的问题?
怪我咯
怪我咯 2017-04-11 12:04:09
[JavaScript讨论组]
for (let i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i) }, 0);
}
输出0-9


for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i) }, 0);
}
输出10个10 

 在sugmentfault 的文章上看到,为什么var 改 let 输出0-9

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
高洛峰

这是 JS 作用域的问题。

var申明的变量,作用域是函数作用域,因为作用域链的关系,虽然外部函数执行结束,但内部函数仍然保持着对外部函数变量的引用。注意这里是引用。因此,在下面的代码中,外部for循环结束后,i的值是 10。而内部函数因为setTimeout的关系,在for循环结束后执行,此时,10 个内部函数引用的外部函数的 i 已经变成了 10,所以就打印了 10 个 10。函数作用域链的问题也是闭包问题产生的原因。

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

而 ES6 (ES2015) 中,用let申明的变量,作用域是块级作用域(在此之前 js 应该是没有块级作用域的概念的)。在下面这个 for 循环中,每次循环,都会生成一个块级作用域,每个块级作用域的 i 都是相互独立的。相当于将某个循环时,i的值给了内部函数,注意这里是赋值,类似函数的参数传递。当内部函数执行时,i就是循环当时i的值。let也是闭包问题解决的一个办法。传统的解决办法是使用参数传递,或者bind这样的方式。

for (let i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i) }, 0);
}
黄舟

for 循环中,通过 let 定义的变量,会在每一次循环都创建一个块级作用域。

大家讲道理

let具有块级作用域,只在代码块内有效
var没有块级作用域,在全局都有效
可以参考以下链接
es6

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号