2012-03-30 52 views
10

如果你不知道我在說什麼,請閱讀John Resig - How JavaScript Timers WorkIs JavaScript guaranteed to be single-threaded?什麼觸發JavaScript代碼執行?

有幾個觸發,在JS引擎的執行先進先出排隊的任務。這不是任何標準的一部分,所以我試圖找到這些觸發器的詳盡列表。 (我想這一切都歸結到內部的事件處理程序,如腳本加載事件計時器事件,但我寧願忽略了發動機的內部和看待事物但從用戶的角度)。

所以到目前爲止我已經確定了初始文件(包括由document.write加入的那些)*

  • <script>元件在運行時*
  • 事件HANDL通過JS插入

    • <script>元件ERS
      - 這包括各種各樣的情況下,如用戶交互,錯誤事件,網絡工作者消息或AJAX回調的...
    • window.setTimeout
    • window.setInterval

    *)只在瀏覽器/ DOM環境

    還有更多嗎? JS引擎之間的任何區別?

  • +0

    到window.setTimeout和window.setInterval類似,現在有window.requestAnimationFrame將嘗試下一次你的顯示器刷新(第二通常1/60次)觸發功能 – jcmiller11 2015-06-02 14:52:51

    +1

    您可以將'的setTimeout() '和'setInterval()'與事件處理程序一起使用,因爲這就是它們:定時事件。基本上,只有兩件事:事件處理程序和腳本加載。 – slebetman 2015-06-03 20:38:10

    回答

    1

    作爲語言名稱的「JavaScript」不應該真的被使用,它太廣泛了。

    ECMAScript是你所指的。您可以在 找到有關ECMAScript的信息。語言標準稱爲ECMA-262,大多數瀏覽器支持5.1版。

    setTimeout,setInterval,DOM事件等不屬於該語言的一部分。這些由主機環境作爲主機對象提供。在使用主機對象時,爲各種主機環境編寫ECMAScript應特別小心。

    ECMAScript代碼在執行上下文中執行。這採用堆棧的形式,並將當前執行上下文的狀態保存在頂部。

    有3種方法可以推送執行上下文。全局代碼,eval和函數。這是啓動代碼的唯一方法。主機環境將使用這些方法來執行代碼。

    主機環境可以提供調用堆棧。這用於堆棧可能在獨立線程中運行的主機對象生成的函數調用。通常,諸如setTimeout之類的事件會將函數添加到調用堆棧中。主機環境將等待,直到執行上下文堆棧爲空,然後從調用堆棧中彈出該函數,創建一個新的執行上下文,執行代碼直至完成。它會重複執行,直到調用堆棧爲空。

    試圖構建主機對象執行上下文管理器的全面列表是徒勞的。

    回答問題。

    還有更多嗎? 是的還有更多。這超出了這個答案的範圍。請參閱您希望使用的特定主機環境。

    JS引擎之間的任何區別? (ECMAScript主機環境)。 是的。再次超出了這個答案的範圍,並依賴於主機

    有幾十個主機環境,並創建了新的主機環境。觸發創建新執行上下文的依據主要取決於主機環境。