在一個函數中,this老是指向當前函數的全部者對象,this老是在運行時才能肯定其具體的指向, 也才能知道它的調用對象。html
1 window.name = "window"; 2 function f(){ 3 console.log(this.name); 4 } 5 f();//輸出window 6 7 var obj = {name:'obj'}; 8 f.call(obj); //輸出obj
在執行f()時,此時f()的調用者是window對象,所以輸出"window"。閉包
f.call(obj) 是把f()放在obj對象上執行,至關於obj.f(),此時f中的this就是obj,因此輸出的是"obj"。函數
code1:post
1 var foo = "window"; 2 var obj = { 3 foo : "obj", 4 getFoo : function(){ 5 return function(){ 6 return this.foo; 7 }; 8 } 9 }; 10 var f = obj.getFoo(); 11 console.log(1+":"+f()); //輸出window
code2:this
1 var foo = "window"; 2 var obj = { 3 foo : "obj", 4 getFoo : function(){ 5 var that = this; 6 return function(){ 7 return that.foo; 8 }; 9 } 10 }; 11 var f = obj.getFoo(); 12 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" url
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"。spa
對做用域鏈不清楚的同窗能夠參看JavaScript從做用域到閉包。code