淺析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 defined console.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. 將實參賦值給形參;
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 }
- 將實參賦值給形參;
// 偽代碼 AO = { c = 4 // b(4),傳入的實參是4 d = undefined }
- 函數(shù)聲明提前
// 偽代碼 AO = { c = f c() {} // 函數(shù)名會覆蓋變量名 d = undefined e = f e() {} }
所以第一次打印變量c的時候,是輸出函數(shù)體,而不是實參4。
以上就是淺析JavaScript預(yù)編譯和暗示全局變量的詳細(xì)內(nèi)容,更多關(guān)于JavaScript預(yù)編譯和暗示全局變量的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
button沒寫type=button會導(dǎo)致點(diǎn)擊時提交
點(diǎn)擊了一個彈窗中的按鈕,想到彈窗消失了,經(jīng)測試后發(fā)現(xiàn)button 沒寫type=button會導(dǎo)致點(diǎn)擊時提交2014-03-03JavaScript中find()和?filter()方法的區(qū)別小結(jié)
js中find和filter方法大家在工作中會經(jīng)常遇到,那么他們有什么區(qū)別呢?這篇文章主要給大家介紹了關(guān)于JavaScript中find()和?filter()方法區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-12-12對google個性主頁的拖拽效果的js的完整注釋[轉(zhuǎn)]
對google個性主頁的拖拽效果的js的完整注釋[轉(zhuǎn)]...2007-04-04如何用JavaScript實現(xiàn)功能齊全的單鏈表詳解
這篇文章主要給大家介紹了關(guān)于如何用JavaScript實現(xiàn)功能齊全的單鏈表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02基于JavaScript實現(xiàn)添加到購物車效果附源碼下載
這篇文章主要介紹了基于JavaScript實現(xiàn)添加到購物車效果附源碼下載的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08JS基于FileSystemObject創(chuàng)建一個指定路徑的TXT文本文件
這篇文章主要介紹了JS基于FileSystemObject創(chuàng)建一個指定路徑的TXT文本文件,涉及javascript使用ActiveXObject控件中FileSystemObject對象模型的基本技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08