首頁  >  文章  >  web前端  >  為什麼在宣告變數之前使用指派給變數的函數表達式執行「setTimeout」失敗,但使用函數宣告執行則成功?

為什麼在宣告變數之前使用指派給變數的函數表達式執行「setTimeout」失敗,但使用函數宣告執行則成功?

DDD
DDD原創
2024-10-25 01:56:02498瀏覽

Why does `setTimeout` fail to execute with a function expression assigned to a variable before it's declared, but succeeds with function declarations?

JavaScript 函數宣告與求值順序

問題:

為什麼下面的 JavaScript 範例無法執行?

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

雖然其他類似的範例如預期般運作:

<code class="javascript">(function() {
  setTimeout(someFunction2, 10);
  function someFunction2() { alert('here2'); }
})();

(function() {
  setTimeout(function() { someFunction3(); }, 10);
  var someFunction3 = function() { alert('here3'); };
})();

(function() {
  setTimeout(function() { someFunction4(); }, 10);
  function someFunction4() { alert('here4'); }
})();</code>

解:

問題在於函數宣告和函數之間問題在於函數宣告和函數之間的計算順序函數表達式。

函數宣告與表達式

  • 宣告: 使用function 關鍵字宣告函數(例如, function someFunction( ){}) 。函數宣告在 編譯 階段進行處理。
  • 表達式: 使用計算結果為函數的表達式建立函數(例如 () => {} )。函數表達式在執行階段進行處理。

求值順序

JavaScript程式碼經歷兩個處理階段:

  1. 編譯:
  2. 編譯: 建立變數並處理函數宣告。

執行: 執行函數表達式和其他程式碼。

  • 範例分析

    • 範例1:
    • 範例1:
    範例1:
  • 函數表達式在執行階段。 setTimeout 函數在 someFunction1 完全計算並指派給變數 someFunction1 之前被呼叫。
    • setTimeout 函數接收 someFunction1 的未定義值,且執行失敗。
    • 範例2、3 和4:
在每個範例中,函數使用function 進行聲明,使其成為

函數宣告

函數宣告在編譯階段進行處理,因此它們在呼叫 setTimeout 函數之前就存在。
  • setTimeout 函數收到有效的函數參考並成功執行。
附加說明JavaScript 中的函數參數總是按值傳遞,這表示setTimeout 函數不直接引用變數someFunction1 ,而是它引用的函數的副本。

以上是為什麼在宣告變數之前使用指派給變數的函數表達式執行「setTimeout」失敗,但使用函數宣告執行則成功?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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