系統城裝機大師 - 唯一官網:www.farandoo.com!

當前位置:首頁 > 網絡編程 > JavaScript > 詳細頁面

JavaScript預編譯和暗示全局變量

時間:2020-09-01來源:www.farandoo.com作者:電腦系統城

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對象,GO = {};
  • 變量聲明提前
// 偽代碼
GO = { 
    a = undefined
}
  • 函數聲明提前
// 偽代碼
GO = { 
    a = undefined
    b = f b(c) { console.log(c); ... }
}

再分析函數預編譯,

  • 創建AO對象,AO = {};
  • 形參和變量聲明提前;
// 偽代碼
AO = { 
    c = undefined    // 與變量名相同,只聲明一個
    d = undefined
}
  • 將實參賦值給形參;
// 偽代碼
AO = { 
    c = 4    // b(4),傳入的實參是4
    d = undefined
}
  • 函數聲明提前
// 偽代碼
AO = { 
    c = f c() {}   // 函數名會覆蓋變量名
    d = undefined
    e = f e() {}
}

所以第一次打印變量c的時候,是輸出函數體,而不是實參4。


 
分享到:

相關信息

系統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門系統下載

jlzzjlzz亚洲乱熟在线播放