先讓我們來看個題,測試以下我們的能力:
var getName = function () { alert (1);};
function getName() { alert (2);}
getName();
大家作出答案了嗎?沒做出來,不要急,下面我們就一起來分析以下。
變量聲明提升
即所有聲明變量或聲明函數(shù)都會被提升到當前函數(shù)的頂部。
例如:
console.log(x);
var x;
x=0;
瀏覽器在執(zhí)行的時候,js引擎會把聲明語句提到最前面,如下:
var x;
console.log(x);
x=0;
函數(shù)表達式
var getName和function getName都是聲明語句,區(qū)別在于var getName是函數(shù)表達式,而function getName是函數(shù)聲明。
函數(shù)表達式最大的問題在于,會將js會將此代碼分為兩行執(zhí)行。
例如:
console.log(x);
var x = 1;
function x(){}
實際執(zhí)行的代碼為,先將var x = 1拆分為var x和x = 1兩行,然后將var x = 1和function x(){}提升至前兩行。
所以最終函數(shù)聲明的x覆蓋了變量聲明的x,log輸出為x函數(shù)。
同理,上題的實際執(zhí)行代碼為:
var getName;//只提升變量聲明
function getName(){//提升函數(shù)聲明,覆蓋var的聲明
alert|(2);p
}
getName = function(){//最終的賦值再次覆蓋function getName聲明
alert(1);
}
getName()//1