keywords:hoisting
,strict mode
拉升 ( Hoisting )
一個 var 宣告會被移到包含它的範疇 ( enclosing scope ) 的最頂端
- 變數 ex:
x = 5; console.log(x); // 5 var x;
函式 ex:
abc(); function abc() { var x = 8; console.log(x); } // 8
Tips:仰賴變數拉升並非常見的做法,函式宣告的拉升較為常見
如果在無法取用某變數的範疇中試著取用該變數的值,就會擲出 ReferenceError
function aaa(){ console.log(x) } function bbb(){ var x = 9; console.log(x); } aaa(); // Uncaught ReferenceError: x is not defined
- 如果試著設定尚未宣告的變數,會依是否使用 strict 模式而有差異:
- 非嚴格模式下 - 尚未宣告的變數在頂層建立了一個全域變數
function abc(){ a = 3; // a 並無正式宣告 console.log(a); } abc(); // 3 a; // 3 omg not good
- 嚴格模式下 - 擲出一個錯誤( 接下來會說明 strict 模式是什麼)
'use strict' function abc(){ a = 3; // a 並無正式宣告 console.log(a); } abc(); // Uncaught ReferenceError: a is not defined
- 非嚴格模式下 - 尚未宣告的變數在頂層建立了一個全域變數
嚴格模式 ( Strict Mode)
會以更嚴謹的方式來規範某些行為,strict 模式通常可以讓程式碼更容易被引擎最佳化,可以讓個別的函式或整個檔案選擇使用 strict 模式
function abc(){
'use strict'
// 這裡的程式碼使用 strict 模式
function bbb(){
// 這裡的程式碼使用 strict 模式
}
}
// 這裡的程式碼不使用 strict 模式
strict 模式關鍵的優點是,它不允許省略 var 宣告而隱含且自動建立全域變數 ( 上方有提到 )
'use strict'
function abc(){
a = 3;
console.log(a);
}
abc(); // 擲出 ReferenceError : a is not defined