JavaScript异步回调和作用域

JavaScript异步回调和作用域,javascript,asynchronous,callback,scope,Javascript,Asynchronous,Callback,Scope,考虑以下示例: var cb = function (t) { console.log('callback -->' + t); }; for(var i = 0; i<3; i++) { console.log(i); setTimeout(function(){ cb(i); },1000); } 一切正常,for循环将3个回调调用放入事件循环。在for循环结束时,i==3,当执行回调时,所有回调都打印3,因为它们包含指向i的链

考虑以下示例:

var cb = function (t) {
    console.log('callback -->' + t);
};

for(var i = 0; i<3; i++) {
    console.log(i);
    setTimeout(function(){
        cb(i);
    },1000);
}
一切正常,for循环将3个回调调用放入事件循环。在for循环结束时,i==3,当执行回调时,所有回调都打印3,因为它们包含指向i的链接,i是3。 如何改进此代码段,以便在执行回调时使用传递给它的实际值

输出应为:

callback ---> 1
callback ---> 2
callback ---> 3
提前谢谢。

您可以试试

for(var i = 0; i<3; i++) {
    console.log(i);
    setTimeout(cb.bind(null, i),1000);
}
for(var i=0;i以便
setTimeout
处理程序将引用闭包的局部变量(在本例中,我们也将其命名为
i
),而不是循环中的
i

for (var i = 0; i < 3; i++) {
    (function (i) {
        console.log(i);
        setTimeout(function () {
            cb(i);
        }, 1000);
    }(i));
}
for(变量i=0;i<3;i++){
(职能(一){
控制台日志(i);
setTimeout(函数(){
cb(i);
}, 1000);
}(i) );
}

我将在cb的function中使用
setTimeout()

var cb = function (t) {
  setTimeout(function(){
    console.log('callback -->' + t);
  },1000);
};


for(var i = 0; i<3; i++) {
    console.log(i);
        cb(i);
}
var cb=函数(t){
setTimeout(函数(){
log('callback-->'+t);
},1000);
};
对于(var i=0;i而言,这是一个常见的问题。
让我们试着使用JS未来的一些特性。我的意思是。
它创建局部范围变量,您不需要使用闭包或其他技巧。
但现在它只在FF中工作(我使用的是20.0.1)


for(var i=0;iNice,但不需要内联定义
cb
;-)不幸的是,这无法完成。回调函数由异步函数调用,但它本身不包含回调函数。非常感谢您提供有关绑定的信息。我将仔细考虑有关它的文档。绑定只是ES5,所以我还不能使用它。您的闭包解决方案工作正常,但Joseph首先发布了类似的解决方案,因此我恐怕会选择他的答案。Neve谢谢分享你的知识!
for (var i = 0; i < 3; i++) {
    (function (i) {
        console.log(i);
        setTimeout(function () {
            cb(i);
        }, 1000);
    }(i));
}
var cb = function (t) {
  setTimeout(function(){
    console.log('callback -->' + t);
  },1000);
};


for(var i = 0; i<3; i++) {
    console.log(i);
        cb(i);
}
for(var i = 0; i<3; i++) {
    console.log(i);
    let a = i;
    setTimeout(function(){               
        cb(a);
    },1000);
}