簡單快速理解js中的this、call和apply

注:本文案例環境爲非嚴格模式,嚴格模式下禁止關鍵字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分別

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