一尘不染

JavaScript变量绑定和循环

javascript

考虑这样的循环:

for(var it = 0; it < 2; it++)
{
    setTimeout(function() {
        alert(it);
    }, 1);
}

输出为:

=> 2
=> 2

我希望它是:0、1。我看到两种解决方法:

解决方案#1。

这一事实基于我们可以将数据传递给setTimeout的事实。

for(var it = 0; it < 2; it++)
{
    setTimeout(function(data) {
        alert(data);
    }, 1, it);
}

解决方案#2。

function foo(data)
{
    setTimeout(function() {
        alert(data);
    }, 1);
}

for(var it = 0; it < 2; it++)
{
    foo(it);
}

还有其他选择吗?


阅读 346

收藏
2020-05-01

共1个答案

一尘不染

除了您提出的两种方法外,没有什么其他的,但这是另一种方法

for(var it = 0; it < 2; it++)
{
    (function() {
        var m = it;   
        setTimeout(function() {
            alert(m);
        }, 1);
    })(); 
}

本质上,您需要捕获闭包中的变量值。此方法使用立即调用的匿名函数将it本地变量中的外部变量值捕获m

2020-05-01