var i=0;
for( var j = 0; j < 3; j++ ){
setTimeout ( function () {
       i=i+1
       console.log('i='+i);  
       console.log('j='+j);  
}, j);
}
这样看就明白了吧 
闭包对j引用的是j本身  所以一直是3

解决方案 »

  1.   

    当你在执行定时器调用的时候,j经过循环已经变成了3,所以始终为3也许你可以考虑如下的实现方式var i =0
    for( var j = 0; j < 3; j++ )
    {
    (function(x){
    setTimeout ( function () {  
           console.log(x);  
    }, 1000)
    })(j)
    };
      

  2.   

    谢谢各位, 有一点不明白 是 为什么没有 console.log(i)的时候,控制台就只是输出一条语句 结果是3,好像没有执行过循环似的,加了console.log(i),就会循环输出了
      

  3.   

    至少在chrome控制台看到的是虽然只有一条显示,但是前边有有个数字3,表示已经输出3次
      

  4.   

    那意思不管如何  settimeout和它的回调函数 都会执行3次吧?
      

  5.   

    发现一个问题 ,console.log(i)或者console.log(j)中 只要每次循环的时候 i或 j的值不变 ,控制台都只会输出一行 ,如果值变动了 就会再输出一行 新的值,比如 i为3 那么 即使循环了3次 控制台也只输出 一行3, 如果 i每次循环的值都不一样如 1,2,3,。 那么控制台 会输出 3行 分别为1,2,3.这是不是因为缓存的关系 ?