记 js 的一个小坑

2016 年 9 月 23 日
 zhy0216
6393 次点击
所在节点    JavaScript
41 条回复
swirling
2016 年 9 月 23 日
var i = 0;
for(; i<3; i ++){
funcList.push(function(){
console.log(i);
})
}

这样不就好理解了吗。。。
viko16
2016 年 9 月 23 日
执行函数的时候才去读 i 的值
learnshare
2016 年 9 月 23 日
经典坑 Number 0
hronro
2016 年 9 月 23 日
for 小括号里面第一个语句,定义的变量 i ,是全局变量 i ,没什么不好理解的吧
lovedebug
2016 年 9 月 23 日
JS 在 ES6 之前 for 循环没有块作用域
loushizan
2016 年 9 月 23 日
var funcs = [];
for (var i = 0; i < 3; i++) {
(function(i) {
funcs.push(function() {
console.log(i);
});
})(i);
};
kimown
2016 年 9 月 23 日
论 ES6 的巨大进步
Skyxianbo
2016 年 9 月 23 日
没什么不好理解的, var 定义的 i 是全局的,等你在第二个循环里面调用的时候才去读 i 的值,这个时候的 i 已经经过第一个循环然后变成 3 了。你把 var 换成 let ,这样定义的 i 只在第一个循环里面起效果,就不会出现这样的问题了。可以去看看 ES6 的块级作用域。
aristotll
2016 年 9 月 23 日
用 let...
think2011
2016 年 9 月 23 日
let let let
wallax
2016 年 9 月 23 日
不用 let 也能解决 只要控制好作用域就行了

var funclist = [];

var func = function(a){
funclist.push(function(){console.log(a)});
};

for(var i = 0; i < 3; i++){
func(i);
}

for(var j = 0; j < 3; j++){
funclist[j]();
}
iyangyuan
2016 年 9 月 23 日
入门问题
SuperMild
2016 年 9 月 23 日
如非必要就别用旧标准了, let 已经得到广泛支持。
js0816
2016 年 9 月 23 日
let 替换 var 就 O 了
prefere
2016 年 9 月 23 日
问个小白问题,这个菊部变量 i 存哪了?
http://imgur.com/KV5NjMA.jpg
prefere
2016 年 9 月 23 日
更正: 菊>局
prefere
2016 年 9 月 23 日
zhouyg
2016 年 9 月 23 日
一点开我就猜是这个问题,😄太经典。
defia
2016 年 9 月 23 日
闭包内保留的是变量引用
cheneydog
2016 年 9 月 23 日
典型的闭包问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/308421

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX