1. 程式人生 > >JS預處理階段、執行階段的理解

JS預處理階段、執行階段的理解

掃描 指針 執行 js預處理 有用 方式 ole 保存 style

預處理階段涉及到變量和(以函數聲明方式聲明的)函數的聲明的提前的原理,並且涉及到聲明變量沖突時候的一些問題。需要與執行階段進行一定的區分,進而加深理解。

1. 預處理階段將變量保存在window域中,會掃描用var操作符聲明的變量以及用函數聲明的方式聲明的函數指針。因此會產生變量提前和函數聲明提前的效果。

需要說明的是:

  • 如果變量並沒有用var聲明,如b = 1;那麽即使在函數執行階段將其默認為全局變量,在預處理階段也不會將其添加到window域中。直到執行到這一條語句的時候,才會將其和對應的值添加。
  • 函數表達式用var聲明,所以處理方式與用var聲明的其他變量一樣。
  • 這段代碼:
var
a = 1; b = 2; function f (){console.log("11");} var g = function(){console.log("22");};

  在預處理階段window域的情況:

window{
    f : 指向函數,
    a : undefined,
    g : undefined
}

  在執行階段window域的情況:

window{
    f : 指向函數,
    a : 1,
    b : 2,
    g : 指向函數
}

2. 如果聲明發生沖突。那麽在預處理的時候遵循兩個規則:a. 先掃描函數,再掃描var聲明的變量;b. 如果與之前的聲明發生沖突的是函數,則覆蓋;如果是var聲明的變量,則忽略,如下面這段代碼:

alert(f);
function f(){ console.log("11"); }
var f = 1;

  alert的將是"f(){console.log("11");}

JS預處理階段、執行階段的理解