成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js中this的“終極三問(wèn)”

silvertheo / 569人閱讀

摘要:是什么本質(zhì)是一個(gè)綁定,在函數(shù)被調(diào)用時(shí)建立。它的指向是完全由函數(shù)被調(diào)用的調(diào)用點(diǎn)來(lái)決定的。因?yàn)楹瘮?shù)的調(diào)用點(diǎn)在全局作用域,所以指向全局變量這里就是函數(shù)的調(diào)用點(diǎn)存在的意義在函數(shù)體內(nèi)部指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。從而實(shí)現(xiàn)干凈的設(shè)計(jì)和更容易的復(fù)用。

this是什么?
this 本質(zhì)是一個(gè)綁定, 在函數(shù)被調(diào)用時(shí)建立。它的指向是完全由函數(shù)被調(diào)用的調(diào)用點(diǎn)來(lái)決定的。

function baz() {
    console.log(this);//因?yàn)閎az函數(shù)的調(diào)用點(diǎn)在全局作用域,所以this指向全局變量
}
baz();//這里就是baz函數(shù)的調(diào)用點(diǎn)

this 存在的意義
在函數(shù)體內(nèi)部指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。從而實(shí)現(xiàn)干凈的 API 設(shè)計(jì)和更容易的復(fù)用。
this的使用

top-level scope

   1) In browsers, the top-level scope is the global scope. This means that within the browser var something will define a new global variable.In Node.js this is different. The top-level scope is not the global scope; var something inside a Node.js module will be local to that module. 
   2) 但是在Node REPL下,與瀏覽器的行為保持一致(timers除外)
       In browsers
           var that = this;
           setTimeout(function() {
             console.log(this);//window
           }, 0);
        Node REPL
           var that = this;
           setTimeout(function() {
             console.log(this);//Timeout {...}
           }, 0);   
       setInterval 結(jié)果相同

嚴(yán)格模式下

   指定的this不在被封裝為對(duì)象,而且如果沒(méi)有指定this,則this的值為undefined
   sloppy mode
       function foo() {
         console.log(this);
       }
       foo.apply("test"); //==>String?{"test"}0: "t"1: "e"2: "s"3: "t"length: 4...[[PrimitiveValue]]: "test"
    strict mode    
       function foo() {
         "use strict";
         console.log(this);
       }
       foo.apply("test"); //==>test        

調(diào)用方法時(shí)沒(méi)有明確對(duì)象,this指向全局對(duì)象

   sloppy mode
       In browsers,this指向window
           console.log(this);//window
       Node REPL, this指向global
           console.log(this);//global
   strict mode
       In browsers,this指向window
           "use strict";
           console.log(this);//window
       Node REPL, this指向global
           "use strict";
           console.log(this);//global            

匿名函數(shù)執(zhí)行時(shí)當(dāng)前對(duì)象是全局對(duì)象

   sloppy mode
       In browsers,
           (function() {
             console.log(this);//window
           })();
       Node REPL
           (function() {
             console.log(this);//global
           })(); 
   strict mode
       In browsers,
           (function() {
             "use strict";
             console.log(this);//undefined
           })();
       Node REPL
           (function() {
             "use strict";
             console.log(this);//undefined
           })(); 

強(qiáng)制一個(gè)函數(shù)調(diào)用使用某個(gè)特定對(duì)象作為 this 綁定,而不在這個(gè)對(duì)象上放置一個(gè)函數(shù)引用屬性
就 this 綁定的角度講,call(..) 和 apply(..) 是完全一樣的
call

   function foo() {
     console.log(this.a);
   }
   var obj = {
     a: 2
   };
   foo.call(obj); //==>2 強(qiáng)制函數(shù)foo()的 this 指向 obj

apply

   function foo() {
     console.log(this.a);
   }
   var obj = {
     a: 2
   };
   foo.apply(obj); //==>2 強(qiáng)制函數(shù)foo()的 this 指向 obj     
    
bind 返回一個(gè)硬編碼的新函數(shù),它使用你指定的 this 環(huán)境來(lái)調(diào)用原本的函數(shù)
   function foo(something) {
     console.log(this.a, something);
     return this.a + something;
   }
   var obj = {
     a: 2
   };
   var a = 6;
   var bar = foo.bind(obj);//使用obj作為this環(huán)境調(diào)用foo()
   var b = bar(3); // 2 3
   console.log(b); // 5
   var test = bar.bind(window);//2 3 
   console.log(test(3)); // 5
   

傳遞 null 或 undefined 作為 call、apply 或 bind 的 this 綁定參數(shù),那么這些值會(huì)被忽略掉。

   sloppy mode
       function foo() {
         console.log(this);
       }
       var obj = {};
       foo.call(null);//window or global
       foo.apply(null);//window or global
       var bar = foo.bind(null);
       console.log(bar());//window or global
    strict mode
       "use strict";
       function foo() {
         console.log(this);
       }
       var obj = {};
       foo.call(null);//null
       foo.apply(null);//null
       var bar = foo.bind(null);
       console.log(bar());//null        

new

   將新構(gòu)建的對(duì)象被設(shè)置為函數(shù)調(diào)用的 this 綁定
   function foo(a) {
     console.log(this);
     this.a = a;
   }
   var bar = new foo(2);//構(gòu)建了一個(gè)新的對(duì)象(foo?{a: 2})并把這個(gè)新對(duì)象作為 foo(..) 調(diào)用的 this
   console.log(bar); //foo?{a: 2}
   console.log(bar.a); // 2
   

arrow functions

   箭頭函數(shù)從封閉它的(函數(shù)或全局)作用域采用 this 綁定
   function foo() {
     // 返回一個(gè)箭頭函數(shù)
     return (a) => { //箭頭函數(shù)在詞法上捕獲 foo() 被調(diào)用時(shí)的 this(obj1)
       // 這里的 `this` 是詞法上從 `foo()` 采用的
       console.log(this.a);
     };
   }
   var obj1 = {
     a: 2
   };
   var obj2 = {
     a: 3
   };
   var bar = foo.call(obj1);
   bar.call(obj2); //2
   
   

Refer:

  https://github.com/CuiFi/You-Dont-Know-JS-CN
  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/this

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109226.html

相關(guān)文章

  • 深入 Parcel--架構(gòu)與流程篇

    摘要:本篇文章是對(duì)的源碼解析,代碼基本架構(gòu)與執(zhí)行流程,帶你了解打包工具的內(nèi)部原理,在這之前你如果對(duì)不熟悉可以先到官網(wǎng)了解介紹下面是偷懶從官網(wǎng)抄下來(lái)的介紹極速零配置應(yīng)用打包工具極速打包使用進(jìn)程去啟用多核編譯。 showImg(https://segmentfault.com/img/bVbpZRp?w=1241&h=893); 本篇文章是對(duì) Parce 的源碼解析,代碼基本架構(gòu)與執(zhí)行流程,帶你...

    yuxue 評(píng)論0 收藏0
  • should.js源碼分析與學(xué)習(xí)

    摘要:結(jié)構(gòu)其中為整個(gè)項(xiàng)目入口,為中的類,負(fù)責(zé)對(duì)測(cè)試信息進(jìn)行記錄。通過(guò)拋出錯(cuò)誤而不是返回布爾值的方式來(lái)通知用戶,能夠更加明顯的通知用戶,也方便向上拋出異常進(jìn)行傳遞。 背景 為了研究與學(xué)習(xí)某些測(cè)試框架的工作原理,同時(shí)也為了完成培訓(xùn)中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的測(cè)試框架的原因,我對(duì)should.js的代碼進(jìn)行了學(xué)習(xí)與分析,現(xiàn)在與大家來(lái)進(jìn)行交流下。 目錄 ext assertion.js assertion-e...

    Turbo 評(píng)論0 收藏0
  • 微信小游戲初體驗(yàn)

    摘要:前言前天一個(gè)跳一跳小游戲刷遍了朋友圈,也代表了微信小程序擁有了搭載游戲的功能早該往這方面發(fā)展了,這才是應(yīng)該有的形態(tài)嘛。作為一個(gè)前端,我的大刀早已經(jīng)饑渴難耐了,趕緊去下一波最新的微信官方開(kāi)發(fā)工具,體驗(yàn)一波小游戲要如何開(kāi)發(fā)。 本文旨在通過(guò)分析官方給出的一個(gè)飛機(jī)大戰(zhàn)小游戲的源代碼來(lái)說(shuō)明如何進(jìn)行小游戲的開(kāi)發(fā)。 1.前言 前天一個(gè)跳一跳小游戲刷遍了朋友圈,也代表了微信小程序擁有了搭載游戲的功能(...

    elina 評(píng)論0 收藏0
  • 一步一步開(kāi)發(fā)安卓下react-native應(yīng)用系列之進(jìn)階篇

    摘要:首先我們打開(kāi)命令行,切換到項(xiàng)目根目錄下,輸入安裝完成后,請(qǐng)注意,需要把目錄下的所有字體文件拷貝到目錄下,如果沒(méi)有該目錄,請(qǐng)自行創(chuàng)建。 ????????看過(guò)我前面文章的朋友們現(xiàn)在應(yīng)該能正常運(yùn)行自己的第一個(gè)RN應(yīng)用了,那都是小兒科,現(xiàn)在我們來(lái)做點(diǎn)進(jìn)階一點(diǎn)的東西。這篇文章有一些屬于干貨性的東西,請(qǐng)仔細(xì)閱讀。特別需要注意我加粗的部分。????????首先我們來(lái)看下js文件結(jié)構(gòu),在項(xiàng)目初始化成功...

    xioqua 評(píng)論0 收藏0
  • Tooltip組件拆解

    摘要:的組件拆解之的中的組件在目錄下。這個(gè)組件核心部分是分別涉略了。 Element的組件拆解之Tooltipelement ui的中的 toolpic組件 在 packages/tooltip目錄下。 這個(gè)組件核心部分是 showImg(https://segmentfault.com/img/bVbnFjF?w=332&h=214); toolpic 分別涉略了。《main.js vue...

    miya 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<