淺析JavaScript預(yù)編譯和暗示全局變量
1. 暗示全局變量
未聲明的變量稱為暗示全局變量。
var a = 1; //函數(shù)體外聲明的變量稱為全局變量b = 2; // 無論函數(shù)體外或函數(shù)體內(nèi)未聲明的變量都稱為暗示全局變量function fn() { var c = 3; //函數(shù)體內(nèi)聲明的變量稱為局部變量 d = 4; // 暗示全局變量}fn(); // 若不執(zhí)行函數(shù),則不會進(jìn)行函數(shù)預(yù)編譯,d 就不會提升為全局變量console.log(c); // error: c is not definedconsole.log(d); // 4
2. JavaScript執(zhí)行過程
1. 語法分析,若存在低級語法錯誤,則不編譯執(zhí)行;2. 預(yù)編譯,包括變量聲明提前和函數(shù)聲明提前;3. 解釋執(zhí)行,解釋一行,執(zhí)行一行。
3. 預(yù)編譯
預(yù)編譯可分為全局預(yù)編譯和函數(shù)預(yù)編譯。
預(yù)編譯可分為全局預(yù)編譯和函數(shù)預(yù)編譯。
1. 在js腳本加載之后,會先通篇檢查是否存在低級錯誤;2. 在語法檢測完之后,便進(jìn)行全局預(yù)編譯;3. 在全局預(yù)編譯之后,就解釋一行,執(zhí)行一行;4. 當(dāng)執(zhí)行到函數(shù)調(diào)用那一行,會先進(jìn)行函數(shù)預(yù)編譯,再往下執(zhí)行。
全局預(yù)編譯:
1. 創(chuàng)建全局對象GO(window對象);2. 變量聲明提前,將所有變量的聲明放到最前面,作為GO對象的屬性,并賦值undefined,若存在變量名相同,只聲明一個;3. 函數(shù)聲明提前,將函數(shù)聲明也放到最前面,作為GO對象的屬性,若函數(shù)名與變量名相同,變量名會被函數(shù)名覆蓋,值是函數(shù)體。這就是函數(shù)定義放到函數(shù)調(diào)用之前或之后都可以的原因。
函數(shù)預(yù)編譯:
1. 在函數(shù)執(zhí)行前的一瞬間,函數(shù)預(yù)編譯閃亮登場;2. 先創(chuàng)建一個AO對象(Active Object);3. 將形參和變量聲明提前,賦值undefined,作為AO的屬性;4. 將實(shí)參賦值給形參;5. 函數(shù)聲明提前,值為函數(shù)體,作為AO的屬性。
栗子:
var a = 1;function b(c){ console.log(c); var c = 2; console.log(c); function c() {} var d = 3; function e() {}}b(4);
先分析全局預(yù)編譯,
創(chuàng)建GO對象,GO = {}; 變量聲明提前// 偽代碼GO = { a = undefined} 函數(shù)聲明提前
// 偽代碼GO = { a = undefined b = f b(c) { console.log(c); ... }}
再分析函數(shù)預(yù)編譯,
創(chuàng)建AO對象,AO = {}; 形參和變量聲明提前;// 偽代碼AO = { c = undefined // 與變量名相同,只聲明一個d = undefined} 將實(shí)參賦值給形參;
// 偽代碼AO = { c = 4 // b(4),傳入的實(shí)參是4d = undefined} 函數(shù)聲明提前
// 偽代碼AO = { c = f c() {} // 函數(shù)名會覆蓋變量名d = undefinede = f e() {}}
所以第一次打印變量c的時候,是輸出函數(shù)體,而不是實(shí)參4。
以上就是淺析JavaScript預(yù)編譯和暗示全局變量的詳細(xì)內(nèi)容,更多關(guān)于JavaScript預(yù)編譯和暗示全局變量的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Python結(jié)合百度語音識別實(shí)現(xiàn)實(shí)時翻譯軟件的實(shí)現(xiàn)2. 教你JS更簡單的獲取表單中數(shù)據(jù)(formdata)3. 如何通過vscode運(yùn)行調(diào)試javascript代碼4. Python基于QQ郵箱實(shí)現(xiàn)SSL發(fā)送5. 測試模式 - XSL教程 - 56. 解決Java中的java.io.IOException: Broken pipe問題7. JAVA抽象類及接口使用方法解析8. python如何寫個俄羅斯方塊9. 《CSS3實(shí)戰(zhàn)》筆記--漸變設(shè)計(一)10. python b站視頻下載的五種版本
