2013-03-21 90 views
1
var count = 0; 
for (var i = 0; i < 4; i++) { 
    setTimeout(function(){ 
    assert(i == count++, "Check the value of i."); 
    }, i * 200); 
} 

为什么不工作(i等于4而不是等于每次计数)? count, var是在全局范围内创建的,为什么它们在函数内部不可用?全局变量不能在匿名函数内工作

(我想解释,为什么这是不行的,我发现了一种方式来获得可以通过另一个函数进行包装工作,只是想了解)

+0

工作方式与预期一样 - > [** FIDDLE **](http://jsfiddle.net/jrP7Z/),但是'i'的值会发生变化,就像您期望的那样。 – adeneo 2013-03-21 20:58:00

回答

6

使用此; i的值将在每个setTime中为4,因为循环已经完成并且值为

匿名函数将通过创建新的上下文来保留其中的变量。

var count = 0; 
for (var i = 0; i < 4; i++) { 
    (function(i){ 
    setTimeout(function(){ 
      assert(i == count++, "Check the value of i."); 
     }, i * 200); 
    })(i); 
}