$.each中使用setTimeout无效 解决方法

转自:http://yeak2001.iteye.com/blog/430522

用字符串拼接的方式每次排队等待的函数里的参数都得到了正确的初始化。而匿名函数里在进入等待队列的时候还没有执行,以至于函数体里的函数参数并没有被初始化,等到FOR循环结束才进行初始化,所以必须使用字符串拼接的方式运行。

[javascript]  view plain  copy
  1. for(var i = 0; i < 10; i++) {  
  2.   
  3.           //参数直到for循环结束才初始化  
  4.          setTimeout(function(){return testDisplay(i);},1000);  
  5.         }  
  6.                   
  7.     function testDisplay(aa) {  
  8.       console.log("this is aa = "+ aa);  
  9.     }  
此时,看控制台的输出,i的输出都为10。

修改一下代码


[javascript]  view plain  copy
  1. for(var i = 0; i < 10; i++) {  
  2.             setTimeout("testDisplay(" + i +")",1000);    
  3.               
  4.             }  
  5.                       
  6.         function testDisplay(aa) {  
  7.           console.log("this is aa = "+ aa);  
  8.         }  

此时,看控制台的输出,i的输出为0~9,这种方法是正确的方法。

原因是什么呢?

setTimeout()有两种形式:
setTimeout(code,interval) 
setTimeout(func,interval,args) 

其中code是一个字符串,这里会用到EVAL()将字符串转换成JS代码执行

用字符串拼接的方式每次排队等待的函数里的参数都得到了正确的初始化。而匿名函数里在进入等待队列的时候还没有执行,以至于函数体里的函数参数并没有被初始化,等到FOR循环结束才进行初始化,因此输出都为10.

猜你喜欢

转载自blog.csdn.net/qq_35232663/article/details/79983216