首頁 >web前端 >js教程 >深入理解Js中的this關鍵字

深入理解Js中的this關鍵字

迷茫
迷茫原創
2017-03-26 17:44:231483瀏覽

研究生畢業答辯完,開始繼續為轉行努力。小白要奮鬥了,加油。本文引自JS核心系列:淺談函數的作用域。

在一個函數中,this總是指向當前函數的所有者對象,this總是在運行時才能確定其具體的指向, 也才能知道它的調用對象。

window.name = "window";
function f(){
    console.log(this.name);
}
f();//输出window

var obj = {name:'obj'};
f.call(obj); //输出obj

在執行f()時,此時f()的呼叫者是window對象,因此輸出"window"。

f.call(obj) 是把f()放在obj物件上執行,相當於obj.f(),此時f中的this就是obj,所以輸出的是"obj"。

 code1:

var foo = "window";
var obj = {
    foo : "obj",
    getFoo : function(){
        return function(){
            return this.foo;
        };
    }
};
var f = obj.getFoo();
console.log(1+":"+f()); //输出window

code2:

var foo = "window";
var obj = {
    foo : "obj",
    getFoo : function(){
        var that = this;
        return function(){
            return that.foo;
        };
    }
};
var f = obj.getFoo();
console.log(f()); //输出obj

code1:
執行var  f = obj.getFoo()回傳的是匿名函數,相當於:
var f = function(){
    return this.foo;
}
f() 相當於window.f(), 因此f中的this指向的是window對象,this.foo相當於window.foo, 所以f()返回"window"

code2:
執行var f = obj.getFoo() 同樣返回匿名函數,即:
var f = function(){
    return that.foo;
}
唯一不同的是f中的this變成了that, 要知道that是哪個對象之前,先確定f的作用域鏈:f->getFoo-> ;window 並在該鏈條上查找that,此時可以發現that指代的是getFoo中的this, getFoo中的this指向其運行時的調用者,從var f = obj.getFoo() 可知此時this指向的是obj對象,因此that.foo 就相當於obj.foo,所以f()返回"obj"。

對作用域鏈不清楚的同學可以參考JavaScript從作用域到閉包。

以上是深入理解Js中的this關鍵字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn