异步回调中的javascript变量已更改
如果删除setTimeout,我可以得到预期的结果 还是这样写异步回调中的javascript变量已更改,javascript,Javascript,如果删除setTimeout,我可以得到预期的结果 还是这样写 a = ["1","2","3"] square = (i,cb)-> i = parseInt(i) setTimeout ()->cb null,i*i,100 for i in a square i,(err,result)-> console.log i + " " + result output: 3 1 3 4 3 9
a = ["1","2","3"]
square = (i,cb)->
i = parseInt(i)
setTimeout ()->cb null,i*i,100
for i in a
square i,(err,result)->
console.log i + " " + result
output:
3 1
3 4
3 9
expected:
1 1
2 4
3 9
这是javascript错误吗?这里是实际javascript中相同的代码,产生相同的结果(和fiddle:)
更新fiddle:这是javascript代码吗?你能做一把小提琴吗?那是什么?咖啡脚本,打字脚本?这不是JavaScript,输出不是bug,而是异步的工作方式。在触发超时调用时,for循环已经完成。因此
i
保存循环中使用的最后一个值,在本例中为3,因此每次输出3。
for i in a
((i)->
square i,(err,result)->
console.log i + " " + result
)(i)
var a = ['1','2','3'];
function square(i, cb){
i = parseInt(i);
setTimeout(function(){
cb(null, i*i);
}, 100);
}
for(var i=0; i<a.length; i++){
var value = a[i];
square(value, function(err, result){
console.log(value, result);
});
}
var a = ['1','2','3'];
function square(i, cb){
i = parseInt(i);
setTimeout(function(){
cb(null, i*i, i);
}, 100);
}
for(var i=0; i<a.length; i++){
var value = a[i];
square(value, function(err, result, initial){
console.log(initial, result);
});
}