注:本文案例環境爲非嚴格模式,嚴格模式下禁止關鍵字this指向全局對象
一、方法是怎麼執行的?
首先說一下js中方法的執行,在window全局下聲明一個方法a:
function a () {
console.log(this);
}
a();//window
全局中執行這個方法普遍的方法是直接a(),這個方法的執行環境是window,控制檯會打印出window對象。
那麼爲什麼會打印出window對象呢?我們可以這樣理解,方法的執行必須要有個直接調用者,剛纔那個方法a是定義在window全局下的,window下的變量和方法有個特點就是訪問和調用的時候可以省略window!所以剛纔執行a() === window.a(),也就是說,執行a方法時的直接調用者是window。!
上面有提到直接調用者,怎麼看待這個直接調用者呢?舉個例子,聲明一個全局對象obj:
var name = "window-name";
var obj = {
name:"obj-name",
a:function(){
console.log(this.name);
},
b:{
name:"b-name",
a:function(){
console.log(this.name);
}
}
}
obj.a();//obj-name
obj.b.a();//b-name
分別執行obj.a();和obj.b.a();控制檯會分別打印出obj-name和b-name(這裏obj.a() === window.obj.a(),obj.b.a() === window.obj.b.a()),方法執行時的直接調用者就是離這個被調用方法最近的那個對象,兩個分別是obj和obj.b,打印出的name分別