「提升是 JavaScript 中的行為,其中所有變數和函數宣告在程式碼執行之前的編譯階段移至包含範圍的頂部」
您可能到處都遇到過這個定義,但“所有變數和函數聲明實際上都位於程式碼頂部,這是一個神話”,這是不正確的!
但是,在提升所有變數和函數聲明時,在編譯中的程式碼執行之前已經分配了內存,並準確地保留在我們鍵入它們的位置。
那麼 var/let/const 和函數是如何提升的。
以下是一些例子:
console.log(a) // undefined console.log(b) // ReferenceError console.log(c) // ReferenceError var a = 10; let b = 20; const c = 30;
使用 var 聲明的變數將被提升,並在編譯期間將 var 變數分配到記憶體中,其值未定義,這就是為什麼當我們在聲明之前控制台 var 時我們得到 undefined
使用 const/let 宣告的變數也會被提升,但不會使用 undefined 來初始化。我們不能在聲明之前訪問它們,否則我們會收到引用錯誤。這是因為臨時死區,即變數存在但未初始化的時間。
但是功能呢
這取決於我們如何宣告我們的函數。見下文。
greet1(); greet2(); greet3(); greet4(); //function declaration is full hoisted function greet1(){ console.log("greet1"); } // TypeError: greet2 is not a function var greet2 = function(){ console.log("greet2"); } // ReferenceError: Cannot access 'greet3' before initialization let greet3 = function(){ console.log("greet2"); } // ReferenceError: Cannot access 'greet4' before initialization const greet4 = function(){ console.log("greet2"); }
傳統函數宣告被完全提升,這意味著我們可以在整個程式碼中呼叫它。
但是對於函數表達式,我們無法在它被宣告之前得到它。這就是為什麼用變數宣告的三個函數會給我們帶來錯誤。所以我們有兩個選擇,要么將函數表達式更改為函數聲明,要么在聲明後調用函數。
以上是在 JavaScript 提升?的詳細內容。更多資訊請關注PHP中文網其他相關文章!