淺析JavaScript預(yù)編譯和暗示全局變量
1. 暗示全局變量
未聲明的變量稱為暗示全局變量。
var a = 1; //函數(shù)體外聲明的變量稱為全局變量 b = 2; // 無(wú)論函數(shù)體外或函數(shù)體內(nèi)未聲明的變量都稱為暗示全局變量 function fn() { var c = 3; //函數(shù)體內(nèi)聲明的變量稱為局部變量 d = 4; // 暗示全局變量 } fn(); // 若不執(zhí)行函數(shù),則不會(huì)進(jìn)行函數(shù)預(yù)編譯,d 就不會(huì)提升為全局變量 console.log(c); // error: c is not defined console.log(d); // 4
2. JavaScript執(zhí)行過(guò)程
1. 語(yǔ)法分析,若存在低級(jí)語(yǔ)法錯(cuò)誤,則不編譯執(zhí)行;
2. 預(yù)編譯,包括變量聲明提前和函數(shù)聲明提前;
3. 解釋執(zhí)行,解釋一行,執(zhí)行一行。
3. 預(yù)編譯
預(yù)編譯可分為全局預(yù)編譯和函數(shù)預(yù)編譯。
預(yù)編譯可分為全局預(yù)編譯和函數(shù)預(yù)編譯。
1. 在js腳本加載之后,會(huì)先通篇檢查是否存在低級(jí)錯(cuò)誤;
2. 在語(yǔ)法檢測(cè)完之后,便進(jìn)行全局預(yù)編譯;
3. 在全局預(yù)編譯之后,就解釋一行,執(zhí)行一行;
4. 當(dāng)執(zhí)行到函數(shù)調(diào)用那一行,會(huì)先進(jìn)行函數(shù)預(yù)編譯,再往下執(zhí)行。
全局預(yù)編譯:
1. 創(chuàng)建全局對(duì)象GO(window對(duì)象);
2. 變量聲明提前,將所有變量的聲明放到最前面,作為GO對(duì)象的屬性,
并賦值undefined,若存在變量名相同,只聲明一個(gè);
3. 函數(shù)聲明提前,將函數(shù)聲明也放到最前面,作為GO對(duì)象的屬性,
若函數(shù)名與變量名相同,變量名會(huì)被函數(shù)名覆蓋,值是函數(shù)體。
這就是函數(shù)定義放到函數(shù)調(diào)用之前或之后都可以的原因。
函數(shù)預(yù)編譯:
1. 在函數(shù)執(zhí)行前的一瞬間,函數(shù)預(yù)編譯閃亮登場(chǎng);
2. 先創(chuàng)建一個(gè)AO對(duì)象(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對(duì)象,GO = {};
- 變量聲明提前
// 偽代碼 GO = { a = undefined }
- 函數(shù)聲明提前
// 偽代碼 GO = { a = undefined b = f b(c) { console.log(c); ... } }
再分析函數(shù)預(yù)編譯,
- 創(chuàng)建AO對(duì)象,AO = {};
- 形參和變量聲明提前;
// 偽代碼 AO = { c = undefined // 與變量名相同,只聲明一個(gè) d = undefined }
- 將實(shí)參賦值給形參;
// 偽代碼 AO = { c = 4 // b(4),傳入的實(shí)參是4 d = undefined }
- 函數(shù)聲明提前
// 偽代碼 AO = { c = f c() {} // 函數(shù)名會(huì)覆蓋變量名 d = undefined e = f e() {} }
所以第一次打印變量c的時(shí)候,是輸出函數(shù)體,而不是實(shí)參4。
以上就是淺析JavaScript預(yù)編譯和暗示全局變量的詳細(xì)內(nèi)容,更多關(guān)于JavaScript預(yù)編譯和暗示全局變量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS區(qū)分瀏覽器頁(yè)面是刷新還是關(guān)閉
在web開發(fā)中我們經(jīng)常各種各樣的需求。今天小編給大家介紹JS區(qū)分瀏覽器頁(yè)面是刷新還是關(guān)閉標(biāo)簽頁(yè),非常實(shí)用,感興趣的童鞋參考下吧2016-04-04微信公眾平臺(tái)API錯(cuò)誤代碼41002的問(wèn)題解決辦法
今天在研究微信公眾號(hào)接口問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于微信公眾平臺(tái)API錯(cuò)誤代碼41002問(wèn)題的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09button沒寫type=button會(huì)導(dǎo)致點(diǎn)擊時(shí)提交
點(diǎn)擊了一個(gè)彈窗中的按鈕,想到彈窗消失了,經(jīng)測(cè)試后發(fā)現(xiàn)button 沒寫type=button會(huì)導(dǎo)致點(diǎn)擊時(shí)提交2014-03-03JavaScript中find()和?filter()方法的區(qū)別小結(jié)
js中find和filter方法大家在工作中會(huì)經(jīng)常遇到,那么他們有什么區(qū)別呢?這篇文章主要給大家介紹了關(guān)于JavaScript中find()和?filter()方法區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-12-12對(duì)google個(gè)性主頁(yè)的拖拽效果的js的完整注釋[轉(zhuǎn)]
對(duì)google個(gè)性主頁(yè)的拖拽效果的js的完整注釋[轉(zhuǎn)]...2007-04-04如何用JavaScript實(shí)現(xiàn)功能齊全的單鏈表詳解
這篇文章主要給大家介紹了關(guān)于如何用JavaScript實(shí)現(xiàn)功能齊全的單鏈表的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02基于JavaScript實(shí)現(xiàn)添加到購(gòu)物車效果附源碼下載
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)添加到購(gòu)物車效果附源碼下載的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08JS基于FileSystemObject創(chuàng)建一個(gè)指定路徑的TXT文本文件
這篇文章主要介紹了JS基于FileSystemObject創(chuàng)建一個(gè)指定路徑的TXT文本文件,涉及javascript使用ActiveXObject控件中FileSystemObject對(duì)象模型的基本技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08JavaScript實(shí)現(xiàn)矩形塊大小任意縮放
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)矩形塊大小任意縮放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08