在for循环中将参数传递给setTimeout

the*_*en 2 javascript arguments loops for-loop settimeout

我正在尝试学习如何在javacript for循环中将参数传递给setTimeout.这是示例代码.正如它目前所写的那样,setTimeout每次传递的精确度都相同,而不是反映实际在数组中的不同i.

var a=100;
for (i in array)
{   
    setTimeout("do_stuff(i, a)"), 2000);    
}
Run Code Online (Sandbox Code Playgroud)

(我在这里看到了一些类似的问题和答案,但代码示例要复杂得多.回答这个最基本的例子可以帮助其他人解决同样的问题.谢谢!)

use*_*716 5

要使用字符串(您不应该这样做),您需要这样做:

var a=100;
for (i in array)
{   
    setTimeout("do_stuff(" + i + ", a)"), 2000);    
}
Run Code Online (Sandbox Code Playgroud)

一个更好的答案是将i变量的范围放在一个新的函数调用中,该调用返回一个匿名函数给出setTimeout().

function do_stuff( i, a ) {
    return function() {
        // do something with i and a
    }
}

var a=100;
for (i in array)
{   
    setTimeout(do_stuff( i , a ), 2000);    
}
Run Code Online (Sandbox Code Playgroud)

现在do_stuff() 返回一个函数,该函数具有对new ia变量的作用域引用.因为每次调用do_stuff都有自己的作用域,所以返回的函数将引用正确的值.


编辑: 关闭主题,但如果array实际上是一个Array,那么你真的不应该使用,for-in因为这是枚举的意思.使用数组,您通常需要迭代数字索引,因此应使用标准for循环.