簡體   English   中英

什么觸發JavaScript代碼執行?

[英]What triggers JavaScript code execution?

如果您不知道我在說什么,請閱讀John Resig - JavaScript定時器如何工作以及JavaScript是否保證是單線程的?

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

到目前為止我已經確定了

  • 初始文檔中的<script>元素(包括document.write添加的元素)*
  • JS在運行時插入的<script>元素*
  • 事件處理程序
    - 這些包括各種各樣的情況,例如用戶交互,錯誤事件,Web Worker消息或Ajax回調......
  • window.setTimeout
  • window.setInterval

*)僅在Browser / DOM環境中

還有嗎? JS引擎之間有什么區別嗎?

“JavaScript”作為一種語言名稱不應該被真正使用它太寬泛。

ECMAScript就是你所指的。 您可以在http://www.ecmascript.org/上找到有關ECMAScript的信息。語言標准稱為ECMA-262,大多數瀏覽器都支持5.1版。

setTimeout,setInterval,DOM事件等不是語言的一部分。 這些由主機環境作為主機對象提供。 在使用主機對象時,應特別注意為各種主機環境編寫ECMAScript。

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

推送執行上下文有3種方法。 全局代碼,評估和功能。 這是啟動代碼的唯一方法。 主機環境將使用這些方法來執行代碼。

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

嘗試構建主機對象執行上下文管理器的完整列表是徒勞的。

回答問題。

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

JS引擎之間有什么區別嗎? (ECMAScript主機環境)。 是。 這再次超出了這個答案的范圍並依賴於主機

有許多主機環境,新的環境一直在創建。 觸發創建新執行上下文的因素在很大程度上取決於主機環境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM