如何使用本地参数创建匿名函数

时间:2011-08-23 19:04:48

标签: javascript anonymous-function

如何使此javascript警报0,1和2而不是3 3?

var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++)
{
    window.setTimeout(function() {alert(i);}, 1000);
}

我知道它为什么这样做,但我无法弄清楚,如何将i传递给匿名函数。

3 个答案:

答案 0 :(得分:9)

您可以将其包装在一个闭包中,如下所示:

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    (function(num) {
        window.setTimeout(function() {alert(vals[num]);}, 1000);
     })(i);
}

试一试:http://jsfiddle.net/qgL7h/

答案 1 :(得分:3)

var vals = [1, 2, 3];
function makeCallback(i)
{
    return function () {alert(i);};
}
for(var i = 0; i < vals.length; i++)
{
    window.setTimeout(makeCallback(i), 1000);
}

答案 2 :(得分:0)

将i传递给函数并不是绝对必要的,它可以分配给局部var里面。

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    (function() {
        var num = i
        window.setTimeout(function() {alert(vals[num]);}, 1000);
     })();
}

“function(){block}()”是必需的,因为Javascript没有正确的块词法变量。最近的版本添加了“let”,这使得这成为可能:

var vals = [1, 2, 3];

for(var i = 0; i < vals.length; i++) {
    let num = i
    window.setTimeout(function() {alert(vals[num]);}, 1000);
}