研究生畢業答辯完,開始繼續為轉行努力。小白要奮鬥了,加油。本文引自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中文網其他相關文章!