Js中的this關鍵字(吉木自學)

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

在一個函數中,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

相關文章
相關標籤/搜索