亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript中的this關鍵字使用方法總結

 更新時間:2015年03月13日 11:04:39   投稿:junjie  
這篇文章主要介紹了JavaScript中的this關鍵字使用方法總結,本文講解了作為對象方法調用、作為函數(shù)調用、作為構造函數(shù)調用、使用 apply 或 call 調用等內(nèi)容,需要的朋友可以參考下

在javascritp中,不一定只有對象方法的上下文中才有this, 全局函數(shù)調用和其他的幾種不同的上下文中也有this指代。
它可以是全局對象、當前對象或者任意對象,這完全取決于函數(shù)的調用方式。JavaScript 中函數(shù)的調用有以下幾種方式:作為對象方法調用,作為函數(shù)調用,作為構造函數(shù)調用,和使用 apply 或 call 調用。

1.作為對象方法調用

在 JavaScript 中,函數(shù)也是對象,因此函數(shù)可以作為一個對象的屬性,此時該函數(shù)被稱為該對象的方法,在使用這種調用方式時,this 被自然綁定到該對象。

復制代碼 代碼如下:
 
var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
    this.x = this.x + x;
    this.y = this.y + y;
    }
};
point.moveTo(1, 1)//this 綁定到當前對象,即 point 對象

2.作為函數(shù)調用

函數(shù)也可以直接被調用,此時 this 綁定到全局對象。在瀏覽器中,window 就是該全局對象。比如下面的例子:函數(shù)被調用時,this 被綁定到全局對象,接下來執(zhí)行賦值語句,相當于隱式的聲明了一個全局變量,這顯然不是調用者希望的。

復制代碼 代碼如下:
 
function makeNoSense(x) {
this.x = x;
}
makeNoSense(5);
x;// x 已經(jīng)成為一個值為 5 的全局變量

對于內(nèi)部函數(shù),即聲明在另外一個函數(shù)體內(nèi)的函數(shù),這種綁定到全局對象的方式會產(chǎn)生另外一個問題。我們?nèi)匀灰郧懊嫣岬降?point 對象為例,這次我們希望在 moveTo 方法內(nèi)定義兩個函數(shù),分別將 x,y 坐標進行平移。結果可能出乎大家意料,不僅 point 對象沒有移動,反而多出兩個全局變量 x,y。

復制代碼 代碼如下:

var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
    // 內(nèi)部函數(shù)
    var moveX = function(x) {
    this.x = x;//this 綁定到了哪里?
   };
   // 內(nèi)部函數(shù)
   var moveY = function(y) {
   this.y = y;//this 綁定到了哪里?
   };

   moveX(x);
   moveY(y);
   }
};
point.moveTo(1, 1);
point.x; //==>0
point.y; //==>0
x; //==>1
y; //==>1

這屬于 JavaScript 的設計缺陷,正確的設計方式是內(nèi)部函數(shù)的 this 應該綁定到其外層函數(shù)對應的對象上,為了規(guī)避這一設計缺陷,聰明的 JavaScript 程序員想出了變量替代的方法,約定俗成,該變量一般被命名為 that。

復制代碼 代碼如下:

var point = {
 x : 0,
 y : 0,
 moveTo : function(x, y) {
      var that = this;
     // 內(nèi)部函數(shù)
     var moveX = function(x) {
     that.x = x;
     };
     // 內(nèi)部函數(shù)
     var moveY = function(y) {
     that.y = y;
     }
     moveX(x);
     moveY(y);
     }
 };
 point.moveTo(1, 1);
 point.x; //==>1
 point.y; //==>1

作為構造函數(shù)調用

JavaScript 支持面向對象式編程,與主流的面向對象式編程語言不同,JavaScript 并沒有類(class)的概念,而是使用基于原型(prototype)的繼承方式。相應的,JavaScript 中的構造函數(shù)也很特殊,如果不使用 new 調用,則和普通函數(shù)一樣。作為又一項約定俗成的準則,構造函數(shù)以大寫字母開頭,提醒調用者使用正確的方式調用。如果調用正確,this 綁定到新創(chuàng)建的對象上。

復制代碼 代碼如下:

function Point(x, y){
   this.x = x;
   this.y = y;
}

使用 apply 或 call 調用

讓我們再一次重申,在 JavaScript 中函數(shù)也是對象,對象則有方法,apply 和 call 就是函數(shù)對象的方法。這兩個方法異常強大,他們允許切換函數(shù)執(zhí)行的上下文環(huán)境(context),即 this 綁定的對象。很多 JavaScript 中的技巧以及類庫都用到了該方法。讓我們看一個具體的例子:

復制代碼 代碼如下:

function Point(x, y){
   this.x = x;
   this.y = y;
   this.moveTo = function(x, y){
       this.x = x;
       this.y = y;
   }
}

var p1 = new Point(0, 0);
var p2 = {x: 0, y: 0};
p1.moveTo(1, 1);
p1.moveTo.apply(p2, [10, 10]);

在上面的例子中,我們使用構造函數(shù)生成了一個對象 p1,該對象同時具有 moveTo 方法;使用對象字面量創(chuàng)建了另一個對象 p2,我們看到使用 apply 可以將 p1 的方法應用到 p2 上,這時候 this 也被綁定到對象 p2 上。另一個方法 call 也具備同樣功能,不同的是最后的參數(shù)不是作為一個數(shù)組統(tǒng)一傳入,而是分開傳入的。

復制代碼 代碼如下:

function Foo(){
//1.this引用的構造函數(shù)是argument.callee引用的對象
//說明是通過new操作符執(zhí)行的構造函數(shù)
if(this.constructor==arguments.callee){
alert('Object Created');
}
//2.this是window, 那么是全局調用
if(this==window){
alert('normal call');
}
else{//3.否則是作為其他對象的方法來調用
alert('called by '+ this.constructor);
}
}
Foo();//全局函數(shù)調用
Foo.call(new Object());//作為一個object對象的成員方法來調用
new Foo();//被new操作符調用,執(zhí)行對象構造

相關文章

  • 淺談JS中json數(shù)據(jù)的處理

    淺談JS中json數(shù)據(jù)的處理

    下面小編就為大家?guī)硪黄獪\談JS中json數(shù)據(jù)的處理。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • js和jquery判斷數(shù)據(jù)類型的4種方法總結

    js和jquery判斷數(shù)據(jù)類型的4種方法總結

    這篇文章主要給大家介紹了關于js和jquery判斷數(shù)據(jù)類型的4種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 不使用script導入js文件的幾種方法

    不使用script導入js文件的幾種方法

    這篇文章主要介紹了不使用script導入js文件的方法,需要的朋友可以參考下
    2016-10-10
  • JS組件Form表單驗證神器BootstrapValidator

    JS組件Form表單驗證神器BootstrapValidator

    做Web開發(fā)的我們,表單驗證是再常見不過的需求了。友好的錯誤提示能增加用戶體驗。今天就來看看bootstrapvalidator如何使用,感興趣的小伙伴們可以參考一下
    2016-01-01
  • json格式數(shù)據(jù)的添加,刪除及排序方法

    json格式數(shù)據(jù)的添加,刪除及排序方法

    這篇文章主要介紹了json格式數(shù)據(jù)的添加,刪除及排序方法,結合實例形式分析了針對一維數(shù)組與二維數(shù)組的json格式數(shù)據(jù)進行增加、刪除與排序的實現(xiàn)技巧,需要的朋友可以參考下
    2016-01-01
  • JavaScript作用域、閉包、對象與原型鏈概念及用法實例總結

    JavaScript作用域、閉包、對象與原型鏈概念及用法實例總結

    這篇文章主要介紹了JavaScript作用域、閉包、對象與原型鏈,結合實例形式總結分析了javascript中變量與函數(shù)的作用域、閉包、對象、原形鏈相關概念、用法及注意事項,需要的朋友可以參考下
    2018-08-08
  • 模擬抽獎

    模擬抽獎

    模擬抽獎...
    2006-08-08
  • 深入理解Ajax的get和post請求

    深入理解Ajax的get和post請求

    下面小編就為大家?guī)硪黄钊肜斫釧jax的get和post請求。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • ES6深入理解之“l(fā)et”能替代”var“嗎?

    ES6深入理解之“l(fā)et”能替代”var“嗎?

    這篇文章主要介紹了關于ES6之"let"能替代"var"的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • D3.js實現(xiàn)簡潔實用的動態(tài)儀表盤的示例

    D3.js實現(xiàn)簡潔實用的動態(tài)儀表盤的示例

    本篇文章主要介紹了D3.js實現(xiàn)簡潔實用的動態(tài)儀表盤的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論