解析JS中this關鍵字

this是javascript語言的一個關鍵字。它可以是全局對象、當前對象或者任意對象,這完全取決於函數的調用方式。
記住:this 永遠指向其所在函數的所有者,如果沒有所有者,指向window。意思就是this所在函數被誰調用的,就指向誰。
 
1)全局函數中的this指向
默認綁定全局變量,當函數被單獨定義和調用的時候,應用的規則就是綁定全局變量。
在JavaScript的變量作用域裏有一條規則“全局變量都是window對象的屬性“。

function test(){
alert(this); 
}
test()這個函數沒有所有者,是一個全局函數,屬於window對象,因此此時this指向的是window
2)對象方法中的this指向
隱式調用,函數調用時擁有一個上下文對象,就好像這個函數是屬於該對象的一樣。

obj.test =function(){
alert(this==obj); //true
}
obj.test表示的是test這個函數的所有者是對象obj,函數是作爲對象obj的方法調用的,因此this應當是指向obj對象
 
3)綁定函數時的this 
如下代碼,test1和test2中this並不相同:
var test2 = o.test1;
test2();
o.test1 =function(){
alert(this===o);
}
test2這個函數並沒有所有者。test2雖然調用了test1這個函數,但是this仍然指向window,而不是指向test1的擁有者:對象o
這便是上面所說的,要將函數與函數名分開看待

此時如果我們對3)中的代碼進行一些修改:
function test (){
alert(this=== o);
}
test();//this指向window
var o ={};
o.test2 = test;
o.test2();//此時test2的所有者爲o,而test沒有所有者,this在此時指向的是o
alert(o.test2);
 
4)鼠標單擊事件等進行函數的綁定時,this的指向
document.οnclick=function(){
alert(this===document); //輸出爲true,
}
onclick事件的擁有者是document。因此,此處this指向document。
5)構造函數中的this
通過構造函數可以生成一個新對象,this就指向這個新對象。
function test(){
    this.x = 1;
  }
  var object = new test();
  alert(object.x);  // 1
6)改變this指向—apply()、call()
可以通過apply()\call() 改變函數的調用對象,切換函數執行的上下文環境(context),即 this 綁定的對象
apply的用法和call的用法大致相同,區別在於第二個參數:
apply只接受兩個參數,第一個參數和call相同(指定該函數將被哪個對象所調用),第二個參數必須是一個數組;
call則作爲call的參數傳入。
如: func.call(thisobj,var1,var2,var3);
  func.apply(thisobj,[var1,var2,var3]);
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章