我的JS筆記 -- this


this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象。雖然函數(shù)的作用域是在聲明時(shí)決定的,但是this實(shí)際上是在函數(shù)被調(diào)用時(shí)發(fā)生的綁定,它指向什么完全取決于函數(shù)在哪里被調(diào)用,所以this的指向是可變的。

this是函數(shù)的內(nèi)部屬性,所以this的使用環(huán)境是在函數(shù)中。

this的指向是一個(gè)對(duì)象。

this綁定規(guī)則

判斷函數(shù)中this綁定的對(duì)象規(guī)則:

  1. 函數(shù)是否在new中調(diào)用(new 綁定)?如果是的話this綁定的是新創(chuàng)建的對(duì)象;
  2. 函數(shù)是否通過(guò)call、apply(顯式綁定)或者硬綁定調(diào)用? 如果是的話,this綁定的是指定的對(duì)象;
  3. 函數(shù)是否在某個(gè)上下文對(duì)象中調(diào)用(也就是函數(shù)作為某個(gè)對(duì)象的方法調(diào)用)(隱式綁定)?如果是的話,this綁定的是那個(gè)上下文對(duì)象;
  4. 如果都不是的話, 使用默認(rèn)綁定。如果在嚴(yán)格模式下,就綁定到undefined,否則綁定到全局對(duì)象;

從上至下逐條判斷,就能正確判斷this的指向。

  • new 綁定,構(gòu)造函數(shù)生成實(shí)例中調(diào)用;

    function F() {
    this.a = 1;
    this.sayA = function () {
    console.log(this.a);
    }
    }
    var f = new F();
    f.sayA(); // 1

  • call、apply調(diào)用(顯式綁定);

    • call、apply接收兩個(gè)參數(shù),第一個(gè)是參數(shù)是對(duì)象,函數(shù)this就會(huì)指向這個(gè)對(duì)象,如果你傳入了一個(gè)原始值(字符串類型、布爾類型或者數(shù)字類型)來(lái)當(dāng)作 this 的綁定對(duì)象,這個(gè)原始值會(huì)被轉(zhuǎn)換成它的對(duì)象形式(也就是 new String(..)、new Boolean(..)或者new Number(..));第二個(gè)參數(shù)是函數(shù)調(diào)用的;

        var a = 1;
        var obj = {
            a: 2
        };
        function f() {
            console.log(this.a);
        }
        f(); // 1
        f.call(obj); // 2,硬性將f的this綁定到指定對(duì)象
        f.apply(obj); // 2
      
    • bind,bind的作用與call、apply一樣,都是為函數(shù)指定執(zhí)行環(huán)境對(duì)象,但是bind返回的是一個(gè)新函數(shù),而call和apply會(huì)直接執(zhí)行返回結(jié)果;

        var a = 1;
        var obj = {
            a: 2
        };
        function f() {
            console.log(this.a);
        }
        f(); // 1
        var f2 = f.bind(obj); // 返回的是一個(gè)新函數(shù),所以可以將函數(shù)保存至變量,方便以后調(diào)用
        f2(); // 2
      
    • 如果你把null或者undefined作為 this 的綁定對(duì)象傳入call、apply或者bind,這些值在調(diào)用時(shí)會(huì)被忽略,實(shí)際應(yīng)用的是默認(rèn)綁定規(guī)則;

  • 作為對(duì)象方法調(diào)用(隱式綁定);

      var a = 1;
      function f() {
          console.log(this.a);
      }
      var obj = {
          a: 2,
          f: f // 將對(duì)象的方法指向函數(shù)
      };
      obj.f(); // 2,當(dāng)函數(shù)作為對(duì)象方法時(shí),this就指向當(dāng)前對(duì)象
    
      var f2 = obj.f;
      f2(); //1,相當(dāng)于直接調(diào)用f,所以this指向全局對(duì)象
    
      var obj2 = {
          a: 3,
          f: obj.f
      };
      obj2.f(); // 3,作為對(duì)象方法調(diào)用
    
  • 默認(rèn)函數(shù)調(diào)用,函數(shù)獨(dú)立調(diào)用;

      var a = 1; // 全局變量會(huì)成為全局對(duì)象的屬性,所以當(dāng)this指向全局對(duì)象時(shí)能夠訪問(wèn)
      function f() {
          console.log(this.a);
      }
      f(); // 1,普通的函數(shù)調(diào)用,this指向全局對(duì)象
    

更多文章在 這里 ,覺(jué)得不錯(cuò)希望點(diǎn)個(gè) star

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 7,006評(píng)論 15 54
  • 參考鏈接 this 關(guān)鍵字 深入理解上下文this 慕課視頻 基本含義 以上示例中實(shí)際都是執(zhí)行的showName方...
    day_day_up閱讀 1,005評(píng)論 2 3
  • Q&A: 1. apply、call 有什么作用,什么區(qū)別? apply: 定義:fun.apply(thisAr...
    進(jìn)擊的阿群閱讀 416評(píng)論 0 0
  • 轉(zhuǎn)換為call/apply來(lái)看待this的值 徹底搞懂this 阮一峰-this原理 this 由于運(yùn)行期綁定的特...
    DeeJay_Y閱讀 800評(píng)論 0 0
  • 與其他語(yǔ)言相比,函數(shù)的this關(guān)鍵字在JavaScript中的表現(xiàn)略有不同,此外,在嚴(yán)格模式和非嚴(yán)格模式之間也會(huì)有...
    codingC閱讀 642評(píng)論 0 0

友情鏈接更多精彩內(nèi)容