1. 程式人生 > >分享點幹貨(此this非彼this)this的詳細解讀

分享點幹貨(此this非彼this)this的詳細解讀

使用 編程 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         var
myClass = 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的詳細解讀