javascript - es6中关于let的一个疑问?
大家讲道理
大家讲道理 2017-04-10 15:43:01
[JavaScript讨论组]
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

为什么在外部调用a[6]()可以访问到for循环内部定义的变量i?是作用域链发生了变化吗?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
PHP中文网

这个是闭包,


《js高级程序设计》中闭包的概念是指有权访问另外一个函数作用域中的变量的函数。我想这里用let创建了块级作用域,也就相当于是一个闭包的环境。

巴扎黑

抱歉没有注意到题主的重点是 let,下面答案 var 时可用,let 没研究期待高手回答


作用域链顶端是循环中定义的那个函数,这个函数没有被释放,i就不会被释放,所以可以访问的到。
另外,这个函数没有形成闭包,所以a[0]()a[9]()的输出结果都是相同的,不是0-9而是10。

高洛峰

首先,先说var:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
} 

不论

a[6]();

还是

a[9]();

其结构都是9;
原由是a[6]和a[9]是一个函数名,对应的是内部的

function () {
    console.log(i);
};

i已经为9,所以结果都是9;
再说let:
let是块级作用域声明变量,for的时候相当于声明了a[0]~a[9]一共9个函数,即for的每个i都只在自己的域内有效(for的每个循环都视为一个块),而var的i在整个函数体内有效,所以可以累加。
以上结论都是我猜得,没实践过,错了不要怪我(:

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

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