日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JavaScript之this指針深入詳解

javascript中的this含義非常豐富,它可以是全局對(duì)象,當(dāng)前對(duì)象或者是任意對(duì)象,這都取決于函數(shù)的調(diào)用方式。函數(shù)有以下幾種調(diào)用方式:作為對(duì)象方法調(diào)用、作為函數(shù)調(diào)用、作為構(gòu)造函數(shù)調(diào)用、apply或call調(diào)用。

致力于企業(yè)形象建設(shè)和產(chǎn)品!多年來,創(chuàng)新互聯(lián)公司不忘初心,以建立行業(yè)服務(wù)標(biāo)桿為目標(biāo),不斷提升技術(shù)設(shè)計(jì)服務(wù)水平,幫助客戶在互聯(lián)網(wǎng)推廣自己的產(chǎn)品、服務(wù),為客戶創(chuàng)造價(jià)值從而實(shí)現(xiàn)自身價(jià)值!中小型企業(yè)如何做成都品牌網(wǎng)站建設(shè)?初創(chuàng)業(yè)公司建站預(yù)算不足?

對(duì)象方法調(diào)用

作為對(duì)象方法調(diào)用的時(shí)候,this會(huì)被綁定到該對(duì)象。

 
 
  1. var point = {
  2. x : 0,
  3. y : 0,
  4. moveTo : function(x, y) {
  5.      this.x = this.x + x;
  6.      this.y = this.y + y;
  7.      }
  8. };

point.moveTo(1, 1)//this 綁定到當(dāng)前對(duì)象,即 point 對(duì)象

這里我想強(qiáng)調(diào)一點(diǎn)內(nèi)容,就是this是在函數(shù)執(zhí)行的時(shí)候去獲取對(duì)應(yīng)的值,而不是函數(shù)定義時(shí)。即使是對(duì)象方法調(diào)用,如果該方法的函數(shù)屬性以函數(shù)名的形式傳入別的作用域,也會(huì)改變this的指向。我舉一個(gè)例子:

 
 
  1. var a = {
  2. aa : 0,
  3. bb : 0,
  4. fun : function(x,y){
  5.   this.aa = this.aa + x;
  6.   this.bb = this.bb + y;
  7. }
  8. };
  9. var aa = 1;
  10. var b = {
  11. aa:0,
  12. bb:0,
  13. fun : function(){return this.aa;}
  14. }
  15. a.fun(3,2);
  16. document.write(a.aa);//3,this指向?qū)ο蟊旧?/li>
  17. document.write(b.fun());//0,this指向?qū)ο蟊旧?/li>
  18. (function(aa){//注意傳入的是函數(shù),而不是函數(shù)執(zhí)行的結(jié)果
  19. var c = aa();
  20. document.write(c);//1 , 由于fun在該處執(zhí)行,導(dǎo)致this不再指向?qū)ο蟊旧?,而是這里的window
  21. })(b.fun);

這樣就明白了吧。這是一個(gè)容易混淆的地方。

函數(shù)調(diào)用

函數(shù)也可以直接被調(diào)用,這個(gè)時(shí)候this被綁定到了全局對(duì)象。

 
 
  1. var x = 1;
  2.  function test(){
  3.    this.x = 0;
  4.  }
  5.  test();
  6.  alert(x); //0

但這樣就會(huì)出現(xiàn)一些問題,就是在函數(shù)內(nèi)部定義的函數(shù),其this也會(huì)指向全局,而和我們希望的恰恰相反。代碼如下:

 
 
  1. var point = {
  2. x : 0,
  3. y : 0,
  4. moveTo : function(x, y) {
  5.      // 內(nèi)部函數(shù)
  6.      var moveX = function(x) {
  7.      this.x = x;//this 綁定到了全局
  8.     };
  9.     // 內(nèi)部函數(shù)
  10.     var moveY = function(y) {
  11.     this.y = y;//this 綁定到了全局
  12.     };
  13.     moveX(x);
  14.     moveY(y);
  15.     }
  16. };
  17. point.moveTo(1, 1);
  18. point.x; //==>0
  19. point.y; //==>0
  20. x; //==>1
  21. y; //==>1

我們會(huì)發(fā)現(xiàn)不但我們希望的移動(dòng)呢效果沒有完成,反而會(huì)多出兩個(gè)全局變量。那么如何解決呢?只要要進(jìn)入函數(shù)中的函數(shù)時(shí)將this保存到一個(gè)變量中,再運(yùn)用該變量即可。代碼如下:

 
 
  1. var point = {
  2. x : 0,
  3. y : 0,
  4. moveTo : function(x, y) {
  5.       var that = this;
  6.      // 內(nèi)部函數(shù)
  7.      var moveX = function(x) {
  8.      that.x = x;
  9.      };
  10.      // 內(nèi)部函數(shù)
  11.      var moveY = function(y) {
  12.      that.y = y;
  13.      }
  14.      moveX(x);
  15.      moveY(y);
  16.      }
  17. };
  18. point.moveTo(1, 1);
  19. point.x; //==>1
  20. point.y; //==>1

構(gòu)造函數(shù)調(diào)用

在javascript中自己創(chuàng)建構(gòu)造函數(shù)時(shí)可以利用this來指向新創(chuàng)建的對(duì)象上。這樣就可以避免函數(shù)中的this指向全局了。

  
 
  1. var x = 2;
  2.   function test(){
  3.     this.x = 1;
  4.   }
  5.   var o = new test();
  6.   alert(x); //2

apply或call調(diào)用

這兩個(gè)方法可以切換函數(shù)執(zhí)行的上下文環(huán)境,也就是改變this綁定的對(duì)象。apply和call比較類似,區(qū)別在于傳入?yún)?shù)時(shí)一個(gè)要求是數(shù)組,一個(gè)要求是分開傳入。所以我們以apply為例:

  
 
  1. var name = "window";
  2. var someone = {
  3.     name: "Bob",
  4.     showName: function(){
  5.         alert(this.name);
  6.     }
  7. };
  8. var other = {
  9.     name: "Tom"
  10. };  
  11. someone.showName();  //Bob
  12. someone.showName.apply();    //window
  13. someone.showName.apply(other);    //Tom

可以看到,正常訪問對(duì)象中方法時(shí),this指向?qū)ο蟆J褂昧薬pply后,apply無參數(shù)時(shí),this的當(dāng)前對(duì)象是全局,apply有參數(shù)時(shí),this的當(dāng)前對(duì)象就是該參數(shù)。

箭頭函數(shù)調(diào)用

這里需要補(bǔ)充一點(diǎn)內(nèi)容,就是在下一代javascript標(biāo)準(zhǔn)ES6中的箭頭函數(shù)的 this始終指向函數(shù)定義時(shí)的 this,而非執(zhí)行時(shí)。我們通過一個(gè)例子來理解:

  
 
  1. var o = {
  2.     x : 1,
  3.     func : function() { console.log(this.x) },
  4.     test : function() {
  5.         setTimeout(function() {
  6.             this.func();
  7.         }, 100);
  8.     }
  9. };
  10. o.test(); // TypeError : this.func is not a function

上面的代碼會(huì)出現(xiàn)錯(cuò)誤,因?yàn)閠his的指向從o變?yōu)榱巳帧N覀冃枰薷纳厦娴拇a如下:

  
 
  1. var o = {
  2.     x : 1,
  3.     func : function() { console.log(this.x) },
  4.     test : function() {
  5.         var _this = this;
  6.         setTimeout(function() {
  7.             _this.func();
  8.         }, 100);
  9.     }
  10. };
  11. o.test();

通過使用外部事先保存的this就行了。這里就可以利用到箭頭函數(shù)了,我們剛才說過,箭頭函數(shù)的 this始終指向函數(shù)定義時(shí)的 this,而非執(zhí)行時(shí)。所以我們將上面的代碼修改如下:

  
 
  1. var o = {
  2.     x : 1,
  3.     func : function() { console.log(this.x) },
  4.     test : function() {
  5.         setTimeout(() => { this.func() }, 100);
  6.     }
  7. };
  8. o.test();

這回this就指向o了,我們還需要注意一點(diǎn)的就是這個(gè)this是不會(huì)改變指向?qū)ο蟮模覀冎纁all和apply可以改變this的指向,但是在箭頭函數(shù)中是無效的。

  
 
  1. var x = 1,
  2.     o = {
  3.         x : 10,
  4.         test : () => this.x
  5.     };
  6. o.test(); // 1
  7. o.test.call(o); // 依然是1

這樣就可以明白各種情況下this綁定對(duì)象的區(qū)別了。


 


當(dāng)前文章:JavaScript之this指針深入詳解
網(wǎng)站路徑:http://www.dlmjj.cn/article/djiiedd.html