转自:http://yeak2001.iteye.com/blog/430522
用字符串拼接的方式每次排队等待的函数里的参数都得到了正确的初始化。而匿名函数里在进入等待队列的时候还没有执行,以至于函数体里的函数参数并没有被初始化,等到FOR循环结束才进行初始化,所以必须使用字符串拼接的方式运行。
- for(var i = 0; i < 10; i++) {
- //参数直到for循环结束才初始化
- setTimeout(function(){return testDisplay(i);},1000);
- }
- function testDisplay(aa) {
- console.log("this is aa = "+ aa);
- }
修改一下代码
- for(var i = 0; i < 10; i++) {
- setTimeout("testDisplay(" + i +")",1000);
- }
- function testDisplay(aa) {
- console.log("this is aa = "+ aa);
- }
此时,看控制台的输出,i的输出为0~9,这种方法是正确的方法。
原因是什么呢?
setTimeout()有两种形式:
setTimeout(code,interval)
setTimeout(func,interval,args)
其中code是一个字符串,这里会用到EVAL()将字符串转换成JS代码执行
用字符串拼接的方式每次排队等待的函数里的参数都得到了正确的初始化。而匿名函数里在进入等待队列的时候还没有执行,以至于函数体里的函数参数并没有被初始化,等到FOR循环结束才进行初始化,因此输出都为10.