js中非常简单的变量泄露问题
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
变量泄露导致上面的a[6]变成10;
我不太理解 这里为什么a[6]是10,我的错误思维如下
- a[6] 这里没有变量, 所以内存泄露源于循环
- 循环中,每次都是把当前次数赋值给对应的数组,
a[0] = function () { console.log(0);};
a[1] = function () { console.log(1);};
......
a[9] = function () { console.log(9);};
再每一次赋值的时候i的值是正确的,赋值后,每个函数都是固定输出一个数字,也不存在变量
3.请问 我的思维错在哪里了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这个题已经问烂了也回答不知道多少遍了
i是全局变量 函数调用的时候获取i 此时 i已经循环到了10
下面是个简单了例子可以理解为经历了两次循环
解决方法 将i变为局部变量
问题源于对函数作用域(链)的理解不够深,一下是个人的一点见解,望能帮助到您:
执行a[6]()的时候,i已经循环到了10了
闭包问题,同学你的基础要加油了.
其实 es6 的 let 根本没抓住问题的本质
关键在于 js 作为一个允许副作用的语言,它的 closure 却只支持引用外层作用域的变量,而不支持「引用」外层作用域中变量的值
C++ 就没有这个问题~
之所以出现这个反直觉的现象,就是因为你那 10 个函数引用的都是同一个 i 变量,而这个变量的值是 for 循环最后一次执行时的值,也就是 10。
简单的闭包问题,我面试的时候都被问到过好几次了。