1. 程式人生 > >js中的作用域和執行上下文的區別

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

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

var a=1;      //全域性作用域
function fn1(){
    var a=2;     //fn1作用域
}

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

this.a=1;      //全域性執行上下文
function fn1(){
    this.a=2;   //fn1執行上下文
}
var obj=new fn1();

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

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

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

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

全域性變數和全域性函式附屬於全域性物件,因此使用var 和this.定義變數是等效的。