无法在循环和setInterval上使用闭包

时间:2016-04-05 12:46:12

标签: javascript closures

我希望在延迟10毫秒后打印0到9的值而不形成任何其他命名函数。

function ClosurePrint(){
            for(i=0;i<10;i++){
                setTimeout(function(){
                    document.writeln(function(y){
                        return y;
                    })(i);
                },10);
            }
        }
        ClosurePrint();

目前正在打印:

function(y) { return y }

1 个答案:

答案 0 :(得分:2)

您正在将函数reference传递给document.write,这将导致打印primitive值。{您可以使用setTimeout的第3个参数将其用作传递函数的参数。

不需要通过每次迭代创建一个范围来处理闭包问题。

function ClosurePrint(){
 for(i=1;i<=10;i++){
    setTimeout(function(i){ 
        document.writeln(i) 
    },1000 * i, i);
 }
}

ClosurePrint();

DEMO

我没有像您在样本中使用的document.write那样使用console.log。我使用过closure。按F12查看控制台。

通过处理IIEF问题,您可以使用function ClosurePrint(){ for(i=1;i<=10;i++){ (function(i){ setTimeout(function(){ document.writeln(i); },1000 * i); })(i); } } ClosurePrint();

编写如下代码
onLoad