2017-09-01 96 views
-2

所以我有这段代码的setTimeout不工作...当关闭包含

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

但同样,这样的设置超时不适合某些原因:/任何想法,为什么?

+4

使用'的setTimeout(()=>酒吧(0) ,1000)'排队一个函数。您只需排列函数的**结果**。 – Sirko

+0

您立即执行该功能。 '巴(0)'。具有讽刺意味的是创建一个闭包会有所帮助,但在这里你只是做了一个简单的函数 – Keith

+0

给定'foo(bar())','bar'总是先执行,其返回值传递给'foo'。对于'setTimeout',这种行为不会奇迹般的改变。 –

回答

0
setTimeout(bar(0), 1000); 

在这里setTimeout需要一个函数,但它会得到bar(0)。因此,尽管尝试初始化巴(0)被调用时,你必须使用

setTimeout(() => bar(0), 1000) 

,使其工作,因为现在它返回一个函数

+1

请查找这些基本问题的重复内容。回答一个可能的欺骗可能会吸引不需要的评论/投票 – Rajesh

+0

是的,我看到它是一个可能的问题重复,但它也回答了为什么立即调用bar(0) – marvel308