JS是解釋執行的腳本語言,在一段JS腳本執行之前,需要先解析代碼,解析的時候會先創建一個全局的執行上下文環境,先把代碼中即將執行的變量,函數聲明提取出來。(內部的函數還沒有執行,不會參與進來)變量先暫時賦值爲undefined,函數則先聲明好即可使用。
以上做完,然後開始正式執行程序。
舉個例子:
console.log(a); //undefined
var a = 100;
fn('zhangsan');
function fn(name){
age = 20;
console.log(name,age); //zhangsan,20
var age;
}
console.log(b); //b is not defined
b = 100;
其中a是undefined,b報錯。原因在於JS代碼在執行之前,要全局解析,發現var a,直到有a這個變量,並將其存入執行上下文,而b沒有用var關鍵字聲明,JS解析器不識別他,因此不會被存入執行上下文。所以在JS代碼執行的時候,a存在於執行上下文,只不過沒有被賦值,爲undefined;而b在執行上下文沒有找到,因此報錯。
另外函數在執行之前,也會創建一個執行上下文環境,跟全局執行上下文類似,不過函數執行上下文多出this,arguments和函數的參數。