JavaScript 函數宣告與值順序
背景:
背景:函數在Java可以是使用表達式聲明或建立。函數宣告發生在編譯階段,而函數表達式在執行階段求值。理解這種差異對於理解 JavaScript 程式碼的行為至關重要。
<code class="javascript">// 1 - does not work (function() { setTimeout(someFunction1, 10); var someFunction1 = function() { alert('here1'); }; })(); // ... other examples</code>
為什麼以下程式碼區塊中的第一個範例失敗,而其餘範例失敗執行成功?
答案:
第一個範例的失敗不是由於範圍或閉包問題,而是由於聲明和表達式之間的誤解.函數表達式被寫成表達式,類似於函數聲明,但在運行時計算。
階段1:編譯
在編譯期間,編譯器處理函數聲明,為函數建立變數。在第一個範例中,變數 someFunction1 已創建,但仍處於未定義狀態,因為其值(函數體)稍後計算。階段2:執行
範例1:
在運作時,解譯器遇到setTimeout(someFunction1, 10 ) 並且嘗試將未定義的someFunction1 傳遞給setTimeout。範例 2:
相反,函數 someFunction2() 是聲明,在編譯期間建立函數。當 setTimeout 被呼叫時,它接收編譯後的函數參考。範例 3:
這裡,一個匿名函數被傳遞給 setTimeout,它創建了一個變數的閉包一些功能3。當setTimeout觸發時,someFunction3已被賦值,函數執行成功。範例4:
與範例2類似,宣告了函數someFunction4,使得它的引用可用於 setTimeout。以上是儘管類似的範例有效,但為什麼此 JavaScript 程式碼會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!