异步回调中的javascript变量已更改

异步回调中的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

如果删除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
    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);
    });
}