Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么闭包不';无法使用async获取正确的外部值?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 为什么闭包不';无法使用async获取正确的外部值?

Javascript 为什么闭包不';无法使用async获取正确的外部值?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,请参阅以下带有以下内容的nodejs代码: 我不明白为什么结果不是[1,2,3]?因为调用中的每个调用都引用了相同的I变量,请思考以下代码: for(i=0;i<3;i++) { calls.push(function(cb){ inc(i, cb); }); } function fn() { var i = 1; setTimeout(function() { alert(i); }, 500); i++; i++; }

请参阅以下带有以下内容的nodejs代码:


我不明白为什么结果不是
[1,2,3]

因为
调用中的每个调用都引用了相同的
I
变量,请思考以下代码:

for(i=0;i<3;i++) {
    calls.push(function(cb){
        inc(i, cb);
    });
}
function fn() {
    var i = 1;
    setTimeout(function() { alert(i); }, 500);
    i++;
    i++;
}
fn();
当然,这将输出3而不是1,这与代码的问题相同,变量
i
在执行调用之前发生了更改

要避免此问题,请使用立即调用的函数表达式
for循环包装起来,以创建一个新的作用域来存储
i

for (var i = 0; i < 3; i++) {
    (function(i) {
        calls.push(function(cb) { inc(i, cb); });
    }(i));
}
for(变量i=0;i<3;i++){
(职能(一){
push(函数(cb){inc(i,cb);});
}(i) );
}

因为
调用
数组中的每个调用都引用相同的
i
变量,所以请考虑以下代码:

function fn() {
    var i = 1;
    setTimeout(function() { alert(i); }, 500);
    i++;
    i++;
}
fn();
当然,这将输出3而不是1,这与代码的问题相同,变量
i
在执行调用之前发生了更改

要避免此问题,请使用立即调用的函数表达式
for循环包装起来,以创建一个新的作用域来存储
i

for (var i = 0; i < 3; i++) {
    (function(i) {
        calls.push(function(cb) { inc(i, cb); });
    }(i));
}
for(变量i=0;i<3;i++){
(职能(一){
push(函数(cb){inc(i,cb);});
}(i) );
}
for (var i = 0; i < 3; i++) {
    (function(i) {
        calls.push(function(cb) { inc(i, cb); });
    }(i));
}