[英]Can't get setTimeout in javascript to work properly
我在javascript中有一個功能:
function test(){
...
if (){
setTimeout(test(), 1000);
}
}
根據手冊,我可以這樣稱呼:
setTimeout(test(), 1000);
實際上,它會調用,但不要等待1。 所以我嘗試像下面這樣使用它,並且可以正常工作。
setTimeout(function(){test();}, 1000);
有人可以向我解釋嗎?
哪本手冊? 調用test()
將通過調用返回的東西test()
並把它傳遞給setTimeout
,所以,除非您的test()
返回一個函數,這是不行的。
您可以使用anon函數替代方法,也可以像setTimeout(test, 1000)
一樣傳遞它而不使用()
。
您在使用過程中可能發現的另一種不好的用法是將其作為字符串傳遞,例如:
setTimeout("test()", 1000)
不惜一切代價避免這種情況,因為這等效於調用eval
,您遲早會遇到范圍問題。
你應該打電話給
setTimeout(test, 1000);
而不是
setTimeout(test(), 1000);
換句話說,要在1000 ms之后調用的函數是test,而不是調用test的結果!
之所以
setTimeout(function(){test();}, 1000);
起作用的原因是您在1000ms之后調用的函數是一個調用test的函數,它基本上是test
本身。 對於lambda演算極客,這稱為eta約簡。
setTimeout
需要函數引用。 當您通過它時:
setTimeout(test(), 1000);
這setTimeout
調用test
函數的結果傳遞給setTimeout
。 而是將其傳遞給參考以進行自我測試:
setTimeout(test, 1000);
想看點什么嗎?
function test () {
var what_are_you = 'a closure';
return function () {
alert('I am '+what_are_you+'!')
}
}
setTimeout(test(), 1000);
在這里,我要從函數調用中返回函數引用。 有關更多信息,請參見下面的文章!
文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.