nodejs-settimeout是否在不同的循环中共享变量

does nodejs settimeout share variable in different loops

本文关键字:循环 共享变量 是否 nodejs-settimeout      更新时间:2023-09-26

在测试Nodejs的settimeout函数时,将settimeout放入两个for循环中,如果两个for环路都有相同的变量名称i,那么这两个settimeout功能似乎共享了该变量。

代码:

for (var i = 1; i <= 3; i++) { 
    var tm1=setTimeout(function(){
         console.log(i); 
            }, 0); 
}
for (var i = 1; i <= 4; i++) {
    (function (x) {
        var tm2=setTimeout(function () { console.log(x); }, 100);
    })(i);
}

结果:6 6 6 1 2 3 4 5
如果for循环有不同的变量名称n和i,结果看起来不错

代码:

for (var n = 1; n <= 3; n++) { 
    //change the variable name from i to n
    setTimeout(function(){
         console.log(n); 
            }, 0); 
}
for (var i = 1; i <= 5; i++) {
    (function (x) {
        var tm2=setTimeout(function () { console.log(x); }, 100);
    })(i);
}

结果:4 4 4 1 2 3 4 5

如何理解这一点?

ES5中只有函数作用域,没有块作用域。您的观察结果与setTimeout函数无关,而是与javascript变量范围有关

阅读此处