變量提升和函數(shù)提升

摘自《你不知道的JavaScript上卷》KYLE SIMPSON著

變量提升

引擎會(huì)在解釋 JavaScript 代碼之前首先對(duì)其進(jìn)行編譯。編譯階段中的一部分工作就是找到所有的聲明,并用合適的作用域?qū)⑺鼈冴P(guān)聯(lián)起來。

所以,包括變量核函數(shù)在內(nèi)的所有聲明都會(huì)在任何代碼被執(zhí)行前首先被處理。

var a = 2;

JavaScript 實(shí)際上會(huì)將其看成兩個(gè)聲明:var a;a = 2;。第一個(gè)定義聲明是在編譯階段進(jìn)行的,第二個(gè)賦值聲明會(huì)被留在原地等待執(zhí)行階段。

函數(shù)提升

函數(shù)聲明會(huì)被提升,但是函數(shù)表達(dá)式卻不會(huì)被提升。

foo();
bar();

var foo = function bar(){
    //...
}

會(huì)被理解為:

var foo;
foo();
bar();
foo = function() {
    var bar = ...self...
    //...
}

函數(shù)優(yōu)先

函數(shù)會(huì)被優(yōu)先提升,然后才是變量。

【1】

foo(); //1
var foo;
function foo(){
    console.log(1);
}

foo = function(){
    console.log(2);
}

【2】

var a=1;function a(){} //1
var a;function a(){} //f a(){}

【3】

foo();//3
function foo(){
    console.log(1);
}
var foo = function(){
    console.log(2);
}
function foo(){
    console.log(3);
}

【4】

foo(); //'b'  根據(jù)書上寫的。一個(gè)普通塊內(nèi)部的函數(shù)聲明通常會(huì)被提升到所在作用域的頂部。   chrome的結(jié)果是foo is not a function
var a = true;
if(a){
    function foo(){console.log('a');}
}else{
    function foo(){console.log('b');}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容