Ch. 4 拉升


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)。

延伸閱讀:我知道你懂 hoisting,可是你了解到多深?


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *