2016-09-24 64 views
0

我正在編寫一個長輪詢腳本並遇到掛起瀏覽器的too much recursion錯誤。我的目標是使用setTimeout()每1000ms調用一次相同的函數。是的,我可以使用setInterval(),但它將是一個長輪詢腳本,並將等待服務器響應。在同一函數中調用`Function`和`Function()`

我通過從我在同一函數中調用的函數中刪除()來解決此問題。

我的腳本是這樣的:

function messagePolling(){ 
    console.log("polled") 
    setTimeout(messagePolling(),1000) // <--- removing `()` from the function works as intended 
} 

messagePolling(); 

這背後有什麼邏輯? messagePolling畢竟不是它的功能。

+2

'messagePolling'是對函數的引用。 'messagePolling()'**調用**函數。你應該知道,因爲你在你的代碼片段的最後一行有'messagePolling();')並且我確定你已經將函數的返回值傳遞給了其他函數,比如'foo(bar()) '。這將調用'bar'並將返回值傳遞給'foo'。這就是函數調用在JavaScript中的作用。 –

+0

參見例如[這個問題](http://stackoverflow.com/questions/1190642/how-can-i-pass-a-parameter-to-a-settimeout-callback)或[許多其他重複](https:// www。 google.de/webhp#q=javascript+settimeout+pass+function+site:stackoverflow.com) – ASDFGerte

回答

5

你是對的 - messagePolling是一個功能。然而,messagePolling()而不是的一個函數。你可以看到在您的控制檯右:

// assume messagePolling is a function that doesn't return anything 
messagePolling() // -> undefined 

所以,當你這樣做:

setTimeout(messagePolling(), 1000) 

你真的這樣做:

setTimeout(undefined, 1000) 

但是,當你這樣做:

setTimeout(messagePolling, 1000) 

你是實際上將功能傳遞給setTimeout。然後setTimeout將知道運行您通過的功能 - messagePolling - 稍後。如果它稍後決定致電undefinedmessagePolling()的結果),它將不起作用,對吧?

1

寫成 setTimeout(messagePolling(),1000)功能被立即執行和一個setTimeout被設置在一秒鐘後調用undefined(在你的函數的返回值)。爲setTimeout(messagePolling,1000)setTimeout設置在一秒鐘後打電話給你的功能(這實際上應該拋出一個錯誤,如果裏面跑Node.js的,因爲undefined是不是有效的函數)

寫。

0

當您鍵入messagePolling時,您將函數作爲參數傳遞給setTimeout。這是使用setTimeout的標準方法。

當你鍵入messagePolling()您正在執行的功能和返回值傳遞給setTimeout

話雖這麼說,這段代碼看起來很奇怪我。這個功能只是自己運行。如果你這樣做,它將無限期地繼續運行。

0

任何一個函數名稱都包含「()」,它會立即執行,除非它用引號括起來,即是一個字符串。

+0

在這種情況下,它不是_function_,而是_string_。如果通過'eval'傳遞該函數,那麼該函數只會被用於執行該函數,如果您將其傳遞給一個字符串,該函數正是'setTimeout'所做的。 – vlaz

+0

E.g var func =「myFunction()」。 setTimout(「myFunction()」,1000)仍然會被執行。但不是立即。簡而言之,我的意思是將函數名稱作爲字符串或變量在不使用其他函數的情況下放入代碼時無法自行運行。 – Taiti

+0

_這不是一個函數_。這就是你的'func'變量包含一個字符串。它只是_happens_成爲你可以執行的代碼,然而,你聽起來像是本質上是延遲執行。事實並非如此。如果你有'setTimeout(「a = b + c; console.log(a)」)'也可以工作,但是_only_因爲它通過'eval'傳遞。如果你通過一些不做'eval'的東西傳遞相同的字符串,它將永遠不會工作。 – vlaz

相關問題