這篇文章帶給大家的內容是關於JavaScript中聲明提升的介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
一、概述
JS 中,我們會理所當然地認為程式碼是一句一句地執行的,但並不完全正確。
singer = "周杰伦"; var singer; console.log(singer); // 周杰伦 sing(); // 故事的小黄花 function sing() { console.log("故事的小黄花"); }
以上第一段程式碼,如果按照正常流程,後面的var singer
會重新把值預設為undefined
,但結果卻是'周杰倫' ;
以上第二段程式碼,會理解成,先執行,後聲明,就會報錯,但結果卻沒有。
以上程式碼區塊其實是可以改寫成這樣的:
var singer = undefined; singer = "周杰伦"; console.log(singer); // 周杰伦 function sing() { console.log("故事的小黄花"); } sing(); // 故事的小黄花
這是因為:
JS 定義宣告會在編譯階段進行,賦值和其他運算則是在執行階段進行。
所以,先有聲明,再有賦值和執行,這就是變數和函數的宣告提升。
二、函數宣告優先於變數宣告;
var foo = "bar"; function foo() { } typeOf(foo); // string var foo = "bar"; function foo() { } typeOf(foo); // string
無論函數宣告放在變數宣告前,或是後,變數宣告都覆寫了函數宣告。
三、每個域都會進行宣告提升
以下程式碼會輸出 10,是為什麼呢?
var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar();
因為:
每個網域都會進行宣告提升。
上面程式碼相當於:
var foo = 1; function bar() { var foo = undefined; if (!foo) { // !foo === true var foo = 10; } alert(foo); } bar();
四、函數表達式不會宣告提升
首先,什麼是函數表達式?
// 函数声明 function foo() { console.log("函数声明"); } // 函数表达式 var foo = function() { console.log("函数表达式"); }
函數表達式,不會宣告提升,所以:
foo(); // Uncaught TypeError: foo is not a function // 函数表达式 var foo = function() { console.log("函数表达式"); }
總結
JavaScript 中存在一種宣告提升的機制,有變數宣告和函數宣告。 JS 引擎會在編譯階段尋找每個作用域的聲明,而賦值和運算則在執行時進行。
函數定義分為函數宣告和函數表達式,其中,函數宣告有宣告提升,函數表達式則沒有。
以上是JavaScript中聲明提升的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!