【发布时间】:2013-11-23 17:03:21
【问题描述】:
以下提醒2每次。
function timer() {
for (var i = 0; i < 3; ++i) {
var j = i;
setTimeout(function () {
alert(j);
}, 1000);
}
}
timer();
var j = i; 不应该将j 设置到 setTimeout 的单个范围内吗?
如果我这样做:
function timer() {
for (var i = 0; i < 3; ++i) {
(function (j) {
setTimeout(function () {
alert(j);
}, 1000);
})(i);
}
}
timer();
它应该提醒0、1、2。
我有什么遗漏吗?
【问题讨论】:
-
"like it should" - 你的意思是“like I want it to”吗? :)
-
你只是想念,Javascript 坏得要命,大约一周前我有完全相同的 WTF 时刻...... :(
-
@VisioN 不是。我知道他们是如何工作的。我想知道为什么他们在这种情况下不能正常工作。
-
@Neal 好吧,我个人看到
j没有在setTimeout的范围内初始化,而是在timer函数的范围内初始化,而在第二个示例中,您创建了一个匿名函数,在哪里传递i,在闭包范围内隐式初始化j。这将创建并执行 3 个功能块,一次设置 3 个超时。 -
令我惊讶的是,回答了 1000 多个 JavaScript/jQuery 问题的人不知道变量范围在语言中是如何工作的。
标签: javascript scope closures