考虑这样循环:JavaScript变量的结合和环
for(var it = 0; it < 2; it++)
{
setTimeout(function() {
alert(it);
}, 1);
}
的输出是:
=> 2
=> 2
我想它是:0,1,我看到两种方法来解决这个问题:
解决方案#1.
这一个基于我们可以传递数据到setTimeout的事实。
for(var it = 0; it < 2; it++)
{
setTimeout(function(data) {
alert(data);
}, 1, it);
}
解决方案#2
function foo(data)
{
setTimeout(function() {
alert(data);
}, 1);
}
for(var it = 0; it < 2; it++)
{
foo(it);
}
是否还有其他选择吗?
+1。但是,您可以通过将方法签名更改为:'function(m){/ * code * /})(it);' – Alan 2012-11-24 21:29:47
+1,但可以有人解释为什么这是行得通的? – 2014-09-17 10:06:01
@digorydoo循环中声明的函数包装在括号中,后跟一组圆括号,用于立即调用该函数。因为变量的作用范围是它们被声明的函数(或者如果没有在函数内声明,则是全局作用域),每次迭代中'it'的值被赋值给作为作用范围的'm'变量立即。 – 2014-09-17 10:35:02