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