光是從字面上的概念上來理解的話有點繞,其實很好區分。
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.定義變量是等效的。