鍍金池/ 問(wèn)答/HTML/ js如何預(yù)編譯?

js如何預(yù)編譯?

1.第一種:運(yùn)行后預(yù)編譯整個(gè)js文件,聲明文件里面的所有變量和函數(shù),然后運(yùn)行
2.第二種:預(yù)編譯先聲明全局變量和函數(shù),而全局函數(shù)中的變量和函數(shù),是在全局函數(shù)運(yùn)行時(shí)進(jìn)行預(yù)編譯聲明然后運(yùn)行

網(wǎng)上的博客眾說(shuō)紛紜,實(shí)在不清楚是那種?還是這兩種都有錯(cuò)
請(qǐng)大神給出明確答案解惑

回答
編輯回答
萌二代

JS引擎在你的代碼執(zhí)行的前一刻(有時(shí)是在執(zhí)行期間?。┚幾g它。
引擎 實(shí)際上將會(huì)在它解釋執(zhí)行你的 JavaScript 代碼之前編譯它。編譯過(guò)程的一部分就是找到所有的聲明,并將它們關(guān)聯(lián)在合適的作用域上。
無(wú)論var出現(xiàn)在一個(gè)作用域內(nèi)部的何處,這個(gè)聲明都被認(rèn)為是屬于整個(gè)作用域,而且在作用域的所有位置都是可以訪問(wèn)的
這種行為稱為 提升,比喻一個(gè)var聲明在概念上 被移動(dòng) 到了包含它的作用域的頂端。
提升是 以作用域?yàn)閱挝坏摹?br>函數(shù)聲明和變量聲明都會(huì)被提升。但一個(gè)微妙的細(xì)節(jié)(可以 在擁有多個(gè)“重復(fù)的”聲明的代碼中出現(xiàn))是,函數(shù)會(huì)首先被提升,然后才是變量。

foo(); // 1

var foo;

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

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

這只是個(gè)大概,完全了解清楚要設(shè)計(jì)到j(luò)s編譯器,作用域等知識(shí)。

2017年12月11日 02:36