Javascript 包含闭包时setTimeout不起作用
所以我有这段代码Javascript 包含闭包时setTimeout不起作用,javascript,Javascript,所以我有这段代码 var string = 'qwe'; document.addEventListener('click', function(e){ function bar(b){ var a = string[b]; if (a == 'q') { console.log('first'); } if (a == 'w') { console.log('second');
var string = 'qwe';
document.addEventListener('click', function(e){
function bar(b){
var a = string[b];
if (a == 'q') {
console.log('first');
}
if (a == 'w') {
console.log('second');
}
if (a == 'e') {
console.log('third');
}
}
setTimeout( bar(0), 1000 );
});
问题是setTimeout不起作用。代码在单击后立即执行
这很奇怪,因为如果我避免使用闭包,它会起作用
setTimeout(function bar(){
var a = string[0];
//...everything else
},1000 );
但这可能会使代码变得混乱/冗余,因为我计划做3次。理想情况下,工作代码应该是
setTimeout( bar(0), 1000 );
setTimeout( bar(1), 2000 );
setTimeout( bar(2), 3000 );
但同样,由于某些原因,设置这样的超时是不起作用的:你知道为什么吗
setTimeout( bar(0), 1000 );
在这里,setTimeout需要一个函数,但它得到了bar0。因此,在调用尝试初始化bar0时,必须使用
setTimeout( () => bar(0), 1000 )
为了使它工作,因为现在它返回一个函数使用setTimeout=>bar0,1000对函数进行排队。您只需将函数的结果排队,就可以立即执行函数了。”bar0'。具有讽刺意味的是,创建一个闭包会有所帮助,但这里您刚刚创建了一个普通函数。给定foobar,bar总是首先执行,其返回值传递给foo。setTimeout不会神奇地改变这种行为。请查找这些基本问题的重复项。回答一个可能重复的问题会吸引不必要的评论/Votes是的,我看到这可能是问题的重复,但它也回答了为什么立即调用bar0