6
for( var i=0; i<20; i++) 
    setTimeout(function(){ 
        console.log(">>> "+i); 
    }, i*100);

所以,上面的代码输出了>>> 1920 次。为了保持i它的迭代值,我使用了一个闭包:

for(var i=0; i<20; i++)(function(i){
    setTimeout(function(){ 
        console.log(">>> "+i); 
    }, i*100);
}(i));

有什么问题?问题是循环控制语句,continue;我可以这样做,return;但是当我需要break;代码时,当其他人尝试阅读它时,它会变得违反直觉。

那么我能做什么呢?

4

2 回答 2

3

这个怎么样?

for (var i = 0; i < 20; i++) {
    var action = (function(i){
        setTimeout(function(){ 
            console.log(">>> "+i); 
        }, i*100);

        // break => return false
        // continue => return anything (e.g. true)
        // default => return nothing
        return false;
    })(i);

    if (action !== undefined) {
        if (!action) {
            break;
        }
        else {
            continue;
        }
    }
}

编辑:
为 continue 语句添加了“支持”。这现在以某种方式像jQuery.each()循环一样工作。

于 2012-07-20T00:44:50.057 回答
1

问题是当 i 变量为 19 时,实际上是在循环之后调用代码。你必须使用一些局部变量。为了不让自己感到困惑,我建议为闭包参数使用另一个名称。

顺便说一下,第二个版本运行良好

于 2012-07-20T00:39:25.353 回答