a = 2; var a; console.log(a); /* reality --------------------------------- */ var a; // hoisting a = 2; console.log(a); // 2
console.log(a); // undefined var a = 2; /* reality --------------------------------- */ var a; // hoisting console.log(a); // undefined a = 2;
編譯器再次出擊
- 變數與函式宣告被移動到程式碼頂端 ⇒ 拉升。
- 可執行邏輯與指派會留在原處。函式運算式也是。
- 拉升動作是逐個範疇 (per-scope) 進行的。
- 函式運算式的情況:
foo(); bar(); var foo = function bar() { ... } /* reality --------------------------------- */ var foo; foo(); // typeError bar(); // referenceError foo = function() { var bar = ...self... }
函式優先
- 函式宣告與變數都會被拉升,但函式優先於變數。
- 後續的函式宣告會覆蓋前面的函式。
P.52 出現在正常區塊內的函式宣告通常會被拉升到包含它的範疇,而非像這段程式碼暗示的那樣是條件式。⇒ 看不太懂 ^^|||
P.52 程式碼:應該要兩個 foo() 都被拉升,並且後面蓋掉前面,而印出 b。但在 Chrome 上,會一開始就出現 TypeError。if .. else .. 的 { } 應該只是風格,而不具有區塊範疇的特性。
複習
var a = 2;
實際上是兩個述句。- 說明拉升 (hoisting)。