要理解javascript的變量聲明和函數聲明的提升,重要的是理解瀏覽器引擎對javascript代碼的處理過程:包括變量和函數在內的所有聲明都會在任何代碼被執行前首先被處理。如:
var a=2;
var b=5;
其處理過程是,先進行變量聲明
var a;
var b;
再進行變量賦值
a=2;
b=5;
1.變量聲明提升
例子1:
function test(){
a=2;
var a;
console.log(a); //2
}
其處理過程是:
function test(){
var a;
a=2;
console.log(a);
}
例子2:
function test(){
console.log(a); //undefined
var a=2;
}
其處理過程是:
function test(){
var a;
console.log(a);
a=2;
}
2.函數聲明提升
例子1:
函數聲明的提升優先級大於變量聲明的提升
foo(); //1
var foo;
function foo(){
console.log(1);
}
foo=function(){
console.log(2);
}
其處理過程:
function foo(){
console.log(1);
}
var foo; //並不執行,重複的聲明
foo();
foo=function(){
console.log(2);
}
例子2:
函數表達式不會被提升
foo(); //TypeError
bar(); //ReferenceError
var foo=function bar(){
//……
}
其處理過程是
var foo;
foo();
bar();
foo=function bar(){
//……
};