记 js 的一个小坑

2016-09-23 13:28:44 +08:00
 zhy0216
5817 次点击
所在节点    JavaScript
41 条回复
swirling
2016-09-23 13:36:31 +08:00
var i = 0;
for(; i<3; i ++){
funcList.push(function(){
console.log(i);
})
}

这样不就好理解了吗。。。
viko16
2016-09-23 13:40:51 +08:00
执行函数的时候才去读 i 的值
learnshare
2016-09-23 13:46:12 +08:00
经典坑 Number 0
hronro
2016-09-23 13:47:55 +08:00
for 小括号里面第一个语句,定义的变量 i ,是全局变量 i ,没什么不好理解的吧
lovedebug
2016-09-23 13:51:12 +08:00
JS 在 ES6 之前 for 循环没有块作用域
loushizan
2016-09-23 13:52:09 +08:00
var funcs = [];
for (var i = 0; i < 3; i++) {
(function(i) {
funcs.push(function() {
console.log(i);
});
})(i);
};
kimown
2016-09-23 13:54:28 +08:00
论 ES6 的巨大进步
Skyxianbo
2016-09-23 13:55:40 +08:00
没什么不好理解的, var 定义的 i 是全局的,等你在第二个循环里面调用的时候才去读 i 的值,这个时候的 i 已经经过第一个循环然后变成 3 了。你把 var 换成 let ,这样定义的 i 只在第一个循环里面起效果,就不会出现这样的问题了。可以去看看 ES6 的块级作用域。
aristotll
2016-09-23 13:56:05 +08:00
用 let...
think2011
2016-09-23 14:05:00 +08:00
let let let
wallax
2016-09-23 14:09:39 +08:00
不用 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-09-23 14:10:15 +08:00
入门问题
SuperMild
2016-09-23 14:22:30 +08:00
如非必要就别用旧标准了, let 已经得到广泛支持。
js0816
2016-09-23 14:22:54 +08:00
let 替换 var 就 O 了
prefere
2016-09-23 14:51:52 +08:00
问个小白问题,这个菊部变量 i 存哪了?
http://imgur.com/KV5NjMA.jpg
prefere
2016-09-23 14:52:46 +08:00
更正: 菊>局
prefere
2016-09-23 14:54:44 +08:00
zhouyg
2016-09-23 16:07:18 +08:00
一点开我就猜是这个问题,😄太经典。
defia
2016-09-23 17:10:13 +08:00
闭包内保留的是变量引用
cheneydog
2016-09-23 17:13:06 +08:00
典型的闭包问题

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

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

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

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

© 2021 V2EX