今天的學習是 Scope & Closure CH.5 以及 Scope & Closure apA.md 的內容。
Why hoisting ?
在 JS 裡,有兩個東西會在 compiling 時被 hoist
var
)greeting(); // Hello World!
function greeting() {
console.log('Hello World!');
};
在 compiling 時期,engine 遇到 function declaration 會將其「提升」至 scope 的最上方。
greeting = "Hello!";
console.log(greeting); // Hello!
var greeting = "Hi!";
在 compiling 到第四行時,engine 會將變數 greeting 提升到 scope 的最上方,並給予 undefined
作為初始值。因此「感覺上」像這樣:
var greeting;
greeting = "Hello!";
console.log(greeting);
greeting(); // TypeError
var greeting = function() {
console.log("Hello World!");
};
我們最開頭提到,function declaration 和 var 變數會被提升。
TypeError 代表 operation 不能正常執行,通常和 value 的 type 不正確有關,詳細看 mdn。
var greeting 雖然被提升至 scope 最上方,但是初始值是 undefined
,而 function(){...}
需等到 runtime 才會被 assign 給 greeting。因此第一行的 greeting value 是 undefined,而不是一個 function。