首頁  >  文章  >  web前端  >  儘管類似的範例有效,但為什麼此 JavaScript 程式碼會失敗?

儘管類似的範例有效,但為什麼此 JavaScript 程式碼會失敗?

Linda Hamilton
Linda Hamilton原創
2024-10-25 07:59:29461瀏覽

Why Does This JavaScript Code Fail, Even Though Similar Examples Work?

JavaScript 函數宣告與值順序

背景:

背景:

函數在Java可以是使用表達式聲明或建立。函數宣告發生在編譯階段,而函數表達式在執行階段求值。理解這種差異對於理解 JavaScript 程式碼的行為至關重要。

<code class="javascript">// 1 - does not work
(function() {
  setTimeout(someFunction1, 10);
  var someFunction1 = function() { alert('here1'); };
})();

// ... other examples</code>
問題:

為什麼以下程式碼區塊中的第一個範例失敗,而其餘範例失敗執行成功?

答案:

第一個範例的失敗不是由於範圍或閉包問題,而是由於聲明和表達式之間的誤解.
  • 函數宣告與表達式:
  • 函數宣告
  • 遵循語法:函數名稱(參數){code}

函數表達式被寫成表達式,類似於函數聲明,但在運行時計算。

階段1:編譯

在編譯期間,編譯器處理函數聲明,為函數建立變數。在第一個範例中,變數 someFunction1 已創建,但仍處於未定義狀態,因為其值(函數體)稍後計算。

階段2:執行

範例1:

在運作時,解譯器遇到setTimeout(someFunction1, 10 ) 並且嘗試將未定義的someFunction1 傳遞給setTimeout。

範例 2:

相反,函數 someFunction2() 是聲明,在編譯期間建立函數。當 setTimeout 被呼叫時,它接收編譯後的函數參考。

範例 3:

這裡,一個匿名函數被傳遞給 setTimeout,它創建了一個變數的閉包一些功能3。當setTimeout觸發時,someFunction3已被賦值,函數執行成功。

範例4:

與範例2類似,宣告了函數someFunction4,使得它的引用可用於 setTimeout。
  • 其他說明:
JavaScript 中的函數參數透過基本類型的值傳遞和物件的參考傳遞。這意味著 setTimeout 不會收到 someFunction 的閉包。 理解聲明和表達式之間的區別對於預測 JavaScript 程式碼的行為至關重要。

以上是儘管類似的範例有效,但為什麼此 JavaScript 程式碼會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn