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

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

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

須要說明的是:指針

  • 若是變量並無用var聲明,如b = 1;那麼即便在函數執行階段將其默認爲全局變量,在預處理階段也不會將其添加到window域中。直到執行到這一條語句的時候,纔會將其和對應的值添加。
  • 函數表達式用var聲明,因此處理方式與用var聲明的其餘變量同樣。
  • 這段代碼:
var a = 1;
     b = 2;

function f (){console.log("11");}

var g = function(){console.log("22");};

   在預處理階段window域的狀況:code

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

  在執行階段window域的狀況:blog

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

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

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

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

相關文章
相關標籤/搜索