javascript作用域和執行上下文的區別


光是從字面上的概念上來理解的話有點繞,其實很好區分。

var a=1;      //全局作用域
function fn1(){
    var a=2;     //fn1作用域
}
  • 1
  • 2
  • 3
  • 4

如上代碼,作用域代表着已聲明變量或者函數的訪問範圍,在fn1作用域內使用變量a會先從當前作用域尋找,如果沒有會往作用域上端尋找。

this.a=1;      //全局執行上下文
function fn1(){
    this.a=2;   //fn1執行上下文
}
var obj=new fn1();
  • 1
  • 2
  • 3
  • 4
  • 5

如上代碼,new fn1()時的執行上下文就是fn1,fn1就是obj的原型。
可以看出,作用域和執行上下文並不是一個概念,它們的區別就像是你訪問a和this.a時的區別。

作用域和執行上下文之間最大的區別是:
執行上下文在運行時確定,隨時可能改變;作用域在定義時確定,永遠不會改變。

但有一種情況下var a和this.a是相同的,如下代碼:

var a=1;
console.log(this.a);  //1
  • 1
  • 2

全局變量和全局函數附屬於全局對象,因此使用var 和this.定義變量是等效的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章