亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:16:44
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript中的this關鍵字使用方法總結,本文講解了作為對象方法調用、作為函數調用、作為構造函數調用、使用 apply 或 call 調用等內容,需要的朋友可以參考下
 

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

1.作為對象方法調用

在 JavaScript 中,函數也是對象,因此函數可以作為一個對象的屬性,此時該函數被稱為該對象的方法,在使用這種調用方式時,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.作為函數調用

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

 

復制代碼代碼如下:
  
function makeNoSense(x) { 
this.x = x; 

makeNoSense(5); 
x;// x 已經成為一個值為 5 的全局變量

 

對于內部函數,即聲明在另外一個函數體內的函數,這種綁定到全局對象的方式會產生另外一個問題。我們仍然以前面提到的 point 對象為例,這次我們希望在 moveTo 方法內定義兩個函數,分別將 x,y 坐標進行平移。結果可能出乎大家意料,不僅 point 對象沒有移動,反而多出兩個全局變量 x,y。

 

復制代碼代碼如下:

var point = { 
x : 0, 
y : 0, 
moveTo : function(x, y) { 
    // 內部函數
    var moveX = function(x) { 
    this.x = x;//this 綁定到了哪里?
   }; 
   // 內部函數
   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 的設計缺陷,正確的設計方式是內部函數的 this 應該綁定到其外層函數對應的對象上,為了規避這一設計缺陷,聰明的 JavaScript 程序員想出了變量替代的方法,約定俗成,該變量一般被命名為 that。

復制代碼代碼如下:

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

 

作為構造函數調用

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

復制代碼代碼如下:

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

 

使用 apply 或 call 調用

讓我們再一次重申,在 JavaScript 中函數也是對象,對象則有方法,apply 和 call 就是函數對象的方法。這兩個方法異常強大,他們允許切換函數執行的上下文環境(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]); 

 

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

復制代碼代碼如下:

function Foo(){
//1.this引用的構造函數是argument.callee引用的對象
//說明是通過new操作符執行的構造函數
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();//全局函數調用
Foo.call(new Object());//作為一個object對象的成員方法來調用
new Foo();//被new操作符調用,執行對象構造
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕大全第二页| 69久久夜色精品国产7777| 欧美成aaa人片在线观看蜜臀| 91av在线免费观看| 国产精品男人爽免费视频1| 91久久久在线| 欧美大片va欧美在线播放| 中文字幕欧美日韩| 国产人妖伪娘一区91| 97涩涩爰在线观看亚洲| 69av在线视频| 成人在线视频网站| 色婷婷av一区二区三区在线观看| 久久综合88中文色鬼| 日韩视频在线免费观看| 亚洲自拍偷拍福利| 亚洲欧洲国产一区| 96精品久久久久中文字幕| 国产精品国产三级国产专播精品人| 日韩av在线高清| 日韩av免费在线看| 国产精品高清网站| 欧美激情亚洲综合一区| 国产精品久久久久久久久男| 精品女同一区二区三区在线播放| 亚洲欧美三级伦理| 97在线免费视频| 久久91亚洲人成电影网站| 98精品国产自产在线观看| 96精品久久久久中文字幕| 国产视频精品在线| 久久这里只有精品99| 中文字幕久精品免费视频| 亚洲天天在线日亚洲洲精| 亚洲第一精品夜夜躁人人爽| 懂色av影视一区二区三区| 91免费在线视频| 国产精品视频网| 91免费看国产| 国产精品十八以下禁看| 国产精品丝袜久久久久久高清| 日本免费在线精品| 欧美久久久精品| 成人亚洲综合色就1024| 久久人人爽人人爽人人片亚洲| xxxxx91麻豆| 亚洲国产精品va| 国产视频久久久久| 国产一级揄自揄精品视频| 啪一啪鲁一鲁2019在线视频| 88国产精品欧美一区二区三区| 疯狂做受xxxx高潮欧美日本| 1769国内精品视频在线播放| 午夜精品福利在线观看| 国产成人激情小视频| 亚洲小视频在线| 亚洲一区二区在线| 黑人极品videos精品欧美裸| 亚洲一区二区三区在线视频| 国产成人免费91av在线| 国产高清在线不卡| 98视频在线噜噜噜国产| 精品成人av一区| 国产va免费精品高清在线观看| 日韩在线欧美在线| 国产精品久久网| 狠狠色狠狠色综合日日五| 欧美性猛交丰臀xxxxx网站| 亚洲free性xxxx护士hd| 国产精品成人v| 精品视频—区二区三区免费| 久久视频在线免费观看| 日韩精品免费在线视频观看| 57pao成人国产永久免费| 欧洲成人在线视频| 国产suv精品一区二区三区88区| 国产自产女人91一区在线观看| 91美女高潮出水| 两个人的视频www国产精品| 88xx成人精品| 久久久电影免费观看完整版| 久久精品成人欧美大片古装| 在线观看视频99| 欧美体内谢she精2性欧美| 久久久久久久成人| 国产精品自拍小视频| 成人h视频在线观看播放| 日韩欧美黄色动漫| 国产98色在线| 国产精品一二三在线| 亚洲一区国产精品| 精品久久久久久中文字幕大豆网| 亚洲乱码国产乱码精品精天堂| 日韩在线不卡视频| 欧美日本精品在线| 黄网动漫久久久| 亚洲欧美在线看| 欧美肥老太性生活视频| 久久免费少妇高潮久久精品99| 亚洲国产日韩欧美在线动漫| 亚洲精品女av网站| 91精品国产91久久久久久吃药| 成人综合网网址| 亚洲欧洲av一区二区| 成人淫片在线看| 欧美日韩国内自拍| 亚洲人成网站777色婷婷| 精品av在线播放| www.xxxx精品| 日韩精品视频免费在线观看| 久久精品视频在线播放| 日韩成人在线网站| 欧美日韩裸体免费视频| 亚洲一区二区三区久久| 亚洲精品视频网上网址在线观看| www.欧美三级电影.com| 日韩av在线天堂网| 亚洲第一区中文字幕| 日韩在线观看网站| 91极品视频在线| 久久精品小视频| 国产精品91在线| 亚洲大胆人体在线| 日韩av一区二区在线| 国产精品久久久久久久久久小说| 在线a欧美视频| 中文亚洲视频在线| 国产在线精品成人一区二区三区| 亚洲日本成人女熟在线观看| 国产成人中文字幕| 91社影院在线观看| 成人福利在线视频| 成人欧美一区二区三区在线| 成人黄在线观看| 2020久久国产精品| 精品视频在线导航| 欧美日韩中文字幕综合视频| 亚洲电影免费观看高清完整版在线观看| 日韩精品在线免费观看| 久久99热精品| 日韩在线视频免费观看| 九九久久综合网站| 一区二区三区美女xx视频| 精品久久久中文| 欧美黑人国产人伦爽爽爽| 欧美日韩亚洲一区二| 久久久久久久一| 欧美激情成人在线视频| 亚洲欧美精品一区二区| 亚洲欧美精品伊人久久| 九九久久国产精品| 深夜福利亚洲导航| 久久成人精品一区二区三区| 国产精品视频99| 日韩精品小视频| 日韩国产在线看| 国产不卡av在线免费观看| 欧美在线视频在线播放完整版免费观看| 黄色成人av在线| 欧美性极品少妇精品网站| 欧美激情二区三区| 欧美精品18videos性欧| 国产精品久久久久久久久久三级| 国产91精品网站|