3 回答

TA貢獻(xiàn)1804條經(jīng)驗 獲得超7個贊
首先所有的函數(shù)聲明都被提升到一個范圍內(nèi)。因此,首先代碼將變量移動foo到作用域的頂部并將其值初始化為函數(shù)。
變量的第二個聲明沒有被提升,因為函數(shù)聲明已經(jīng)被提升。所以代碼是一樣的
function checkType() {
var foo = function(){}
return foo;
foo = 10;
foo = 11;
};

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊
當(dāng)我們運行代碼時,它有兩個階段,首先是creation phase在這個階段語法解析器將讀取代碼并提升函數(shù)和變量,第二階段是execution phase將值分配給提升的變量,
這里需要注意的一點是函數(shù)在創(chuàng)建階段存儲在內(nèi)存中,因為它是變量被提升但值未初始化的地方(將在執(zhí)行階段分配)
提升后編譯器會這樣對待你的代碼
function checkType() {
var foo = function() {}; //hoisted function
return foo;
foo = 10;
foo = 11;
};
console.log(typeof checkType(), '\nRturned value from function --->', checkType())
如果您將函數(shù)定義為變量,則它只會被提升但不會用值進(jìn)行初始化,您可以看到以下示例
function checkType() {
return foo;
foo = 10;
var foo = function foo() {};
var foo = 11;
};
console.log(typeof checkType(), '\nRturned value from function --->', checkType())
添加回答
舉報