扫码关注官方订阅号
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
为什么在外部调用a[6]()可以访问到for循环内部定义的变量i?是作用域链发生了变化吗?
a[6]()
i
光阴似箭催人老,日月如移越少年。
这个是闭包,
《js高级程序设计》中闭包的概念是指有权访问另外一个函数作用域中的变量的函数。我想这里用let创建了块级作用域,也就相当于是一个闭包的环境。
抱歉没有注意到题主的重点是 let,下面答案 var 时可用,let 没研究期待高手回答
作用域链顶端是循环中定义的那个函数,这个函数没有被释放,i就不会被释放,所以可以访问的到。另外,这个函数没有形成闭包,所以a[0]()到a[9]()的输出结果都是相同的,不是0-9而是10。
a[0]()
a[9]()
首先,先说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中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这个是闭包,
《js高级程序设计》中闭包的概念是指有权访问另外一个函数作用域中的变量的函数。我想这里用let创建了块级作用域,也就相当于是一个闭包的环境。
抱歉没有注意到题主的重点是 let,下面答案 var 时可用,let 没研究期待高手回答
作用域链顶端是循环中定义的那个函数,这个函数没有被释放,i就不会被释放,所以可以访问的到。
另外,这个函数没有形成闭包,所以
a[0]()
到a[9]()
的输出结果都是相同的,不是0-9而是10。首先,先说var:
不论
还是
其结构都是9;
原由是a[6]和a[9]是一个函数名,对应的是内部的
i已经为9,所以结果都是9;
再说let:
let是块级作用域声明变量,for的时候相当于声明了a[0]~a[9]一共9个函数,即for的每个i都只在自己的域内有效(for的每个循环都视为一个块),而var的i在整个函数体内有效,所以可以累加。
以上结论都是我猜得,没实践过,错了不要怪我(: