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);
}