Javascript 为什么闭包不';无法使用async获取正确的外部值?
请参阅以下带有以下内容的nodejs代码: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++; }
我不明白为什么结果不是
[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));
}