要理解javascript的變量聲明和函數(shù)提升,重要的是理解瀏覽器對javascript代碼的處理過程。
包括變量和函數(shù)在內(nèi)的聲明都會在代碼被執(zhí)行時被先處理。
例子:
在編輯器中寫:var a = 1;
瀏覽器處理過程是:(先聲明變量)var a;(再變量賦值)a = 1;
1.變量的提升:
例子:
function test(){
a = 2;
var a;
console.log(a) //2
}
實際瀏覽器處理過程:
function test(){
var a;
a = 2;
console.log(a) //2
}
例子2:
function test(){
console.log(a)
a = 2;
var a ;
}
實際瀏覽器處理過程:
function(){
var a;
console.log(a) //undefined 因為a還沒有被賦值
a = 2;
}
2.函數(shù)聲明提升:
函數(shù)聲明的提升優(yōu)先大于變量的提升,同樣這樣的聲明的時候,不論先后順序,函數(shù)的聲明都會覆蓋變量的聲明
例子1:
var a = 1;
function f(){
console.log(a);
var a = 2;
console.log(a);
} f();
實際瀏覽器處理過程:
var a;
a = 1;
function f(){
var a ;
console.log(a)
//由于a在第一個console.log(a)語句之前就已經(jīng)定義了,但是并沒有賦值,因此此時a的指是undefined
a = 2;
console.log(a)
// 第二個console.log(a)語句之前,a已經(jīng)完成賦值為2,所以輸出的結(jié)果是2
}
例子2:
函數(shù)聲明語法:
f("hello");
function f(a){
console.log(a)//hello
}
函數(shù)表達語法:
f("hello");
var f = function (a){
console.log(a)//會報錯。f is not function
}
為什么會報錯,理解下瀏覽器處理過程:
var f;
f("hello");//報錯,f雖然被定義了,但是沒有被賦值所以會出現(xiàn)f is not function,如果把它放在最后就能執(zhí)行成功
f = function (a){
console.log(a)
}
例子3:
getName();
var getName = function(){
console.log("小明");
}
function getName(){
console.log("大明");
}
getName();
我們來解析一下例子3瀏覽器是如何處理的:
var getName;//首先變量被提升到頂部,定義未被賦值
function getName(){//函數(shù)聲明也被被提升到頂部
console.log("大明")
}
getName();//調(diào)用函數(shù)聲明,打印“大明”
getName = function() {//變量賦值
console.log("小明")
}
getName() //調(diào)用函數(shù),頂部的函數(shù)聲明又被函數(shù)表達式的賦值操作給覆蓋了,所以輸出小明。
如有錯誤請指正,省得誤人子弟