分享點幹貨(此this非彼this)this的詳細解讀
阿新 • • 發佈:2018-02-13
使用 編程 var pan his () col 作者 分析
在javascript編程中,this關鍵字經常讓初學者感到迷惑,這裏,針對此this根據查閱的資料和個人的理解分享一下,純手打,大神勿噴。
首先先說一下this的指向,大致可以分為以下四種。
1.作為對象的方法調用。
2.作為普通函數調用。
3.構造器調用。
4.Function.prototype.call或者是Function.prototype.apply調用。
這四種調用很重要,如果能徹底理解了,應該不會再對這個this感到迷惑了。
1.作為對象的方法調用
1 var obj = { 2 value: 1, 3 getValue: function() { 4 console.log(this === obj);//輸出 true 5 console.log(this.value); //輸出 1 6 } 7 }; 8 obj.getValue();
2.作為普通函數調用
當函數不作為對象的屬性被調用時,也就是普通的函數調用方式,通常來講,this是指向全局對象的,在瀏覽器裏,也就是window對象。
1 window.name = "michael"; 2 var obj = { 3 name:"tom",4 getName:function() { 5 return this.name; 6 } 7 }; 8 var getName = obj.getName; 9 console.log(getName()); //輸出 michael
3.構造器調用
除了宿主提供的一些內置函數,大部分的javascript函數可以當構造器來使用,它和普通函數的區別在於被調用的方式。當使用new來調用的時候,通常是返回一個對象,構造器裏的this就指向這個返回的對象。
1 varmyClass = function(){ 2 this.name = "michael"; 3 }; 4 var obj = new myClass(); 5 console.log(obj.name);// 輸出michael
但是,使用new調用的時候,還需要註意這樣一個問題,如果構造器顯式返回一個object類型的對象的時候,那麽這次最終返回的是這個對象,而不是this.
1 var myClass = function(){ 2 this.name = "michael"; 3 return {//顯式返回一個對象 4 name:"tom" 5 }; 6 }; 7 var obj = new myClass(); 8 console.log(obj.name);// 輸出tom
上述情況需要特殊註意.
4.Function.prototype.call或者是Function.prototype.apply調用
與第二種普通函數調用相比,call或者apply可以動態改變this的指向,聽著蠻高大上的。
1 var obj = { 2 name:"michael", 3 getName:function() { 4 return this.name; 5 } 6 }; 7 var obj2 = { 8 name:"tom" 9 }; 10 console.log(obj.getName()); //輸出 michael 11 console.log(obj.getName.call(obj2)); //輸出 tom
通過代碼分析來看,顯然this的指向已經人為的改變了。
以上就是關於this的一點小小的分享。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
分享點幹貨(此this非彼this)this的詳細解讀