Alex Liang

[Javascript筆記] Hoisting

在Javascript中對於宣告(declaration)會移到作用域的最上方,此預設行為稱為Hoisting。

以下的範例會印出10

1
2
3
x = 10;
var x;
console.log(x);

實際上javascript interpreter會將x的宣告移到上方,也就是:

1
2
3
var x = undefined;
x = 10;
console.log(x);

hositing也會影響function expression的執行,例如:

1
2
3
4
5
6
7
8
9
10
11
function hoistingTest() {
foo(); // 錯誤
bar();
var foo = function () {
alert("foo");
};

function bar() {
alert("bar");
}
}

這段程式碼對javascript來說是長這樣:

1
2
3
4
5
6
7
8
function hoistingTest() {
var foo = undefined;
foo(); // 此時foo為一undefined的變數
foo = function () {
alert("foo");
}
// ...略
}

Javascript雖然語法上是c-like,但在作用域(scope)的觀念有差別,這也會影響程式執行結果。

參考資料:
Javascript Scoping and Hoisting
Hoisting基本解說