闭包如何在以下代码中工作

时间:2017-09-01 09:55:39

标签: javascript closures

我是一个新手,并且对以下代码非常困惑。

for (var i=1; i<=5; i++) {
    console.log('ooo');
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}

此代码的输出如下:

ooo
ooo
ooo
ooo
ooo
6
6
6
6
6

先谢谢我解释这段代码。

2 个答案:

答案 0 :(得分:0)

for (var i=1; i<=5; i++) {
    console.log('ooo');
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}

在这段代码中调用setTimeout()时,for循环就完了,每个函数都会引用相同的i值,即6

function closure(i){
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}

for (var i=1; i<=5; i++) {
    console.log('ooo');
    closure(i);
}

这会打印i = 1到5,因为函数只能看到i中相应的值

答案 1 :(得分:0)

正确的结果应如下所示 你应该按照以下指示思考 1个代码将控制台000&lt; = 5次 我的循环增加了你。当第一次执行定时器功能时,我已经增加,现在估值为127然后是6。

16:57:40.946  ooo
16:57:40.946  ooo
16:57:40.946  ooo
16:57:40.947  ooo
16:57:40.947  ooo
16:57:40.947  127
16:57:41.949  6
16:57:42.947  6
16:57:43.951  6
16:57:44.947  6
16:57:45.950  6