您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關JavaScript中暗示全局變量和預編譯的區別,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1. 暗示全局變量
未聲明的變量稱為暗示全局變量。
var a = 1; //函數體外聲明的變量稱為全局變量 b = 2; // 無論函數體外或函數體內未聲明的變量都稱為暗示全局變量 function fn() { var c = 3; //函數體內聲明的變量稱為局部變量 d = 4; // 暗示全局變量 } fn(); // 若不執行函數,則不會進行函數預編譯,d 就不會提升為全局變量 console.log(c); // error: c is not defined console.log(d); // 4
2. JavaScript執行過程
1. 語法分析,若存在低級語法錯誤,則不編譯執行;
2. 預編譯,包括變量聲明提前和函數聲明提前;
3. 解釋執行,解釋一行,執行一行。
3. 預編譯
預編譯可分為全局預編譯和函數預編譯。
預編譯可分為全局預編譯和函數預編譯。
1. 在js腳本加載之后,會先通篇檢查是否存在低級錯誤;
2. 在語法檢測完之后,便進行全局預編譯;
3. 在全局預編譯之后,就解釋一行,執行一行;
4. 當執行到函數調用那一行,會先進行函數預編譯,再往下執行。
全局預編譯:
1. 創建全局對象GO(window對象);
2. 變量聲明提前,將所有變量的聲明放到最前面,作為GO對象的屬性,
并賦值undefined,若存在變量名相同,只聲明一個;
3. 函數聲明提前,將函數聲明也放到最前面,作為GO對象的屬性,
若函數名與變量名相同,變量名會被函數名覆蓋,值是函數體。
這就是函數定義放到函數調用之前或之后都可以的原因。
函數預編譯:
1. 在函數執行前的一瞬間,函數預編譯閃亮登場;
2. 先創建一個AO對象(Active Object);
3. 將形參和變量聲明提前,賦值undefined,作為AO的屬性;
4. 將實參賦值給形參;
5. 函數聲明提前,值為函數體,作為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);
先分析全局預編譯,
// 偽代碼 GO = { a = undefined }
// 偽代碼 GO = { a = undefined b = f b(c) { console.log(c); ... } }
再分析函數預編譯,
// 偽代碼 AO = { c = undefined // 與變量名相同,只聲明一個 d = undefined }
// 偽代碼 AO = { c = 4 // b(4),傳入的實參是4 d = undefined }
// 偽代碼 AO = { c = f c() {} // 函數名會覆蓋變量名 d = undefined e = f e() {} }
所以第一次打印變量c的時候,是輸出函數體,而不是實參4。
看完上述內容,你們對JavaScript中暗示全局變量和預編譯的區別有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。