中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript的this關鍵字定義和用法

發布時間:2021-09-01 18:02:58 來源:億速云 閱讀:169 作者:chen 欄目:移動開發

本篇內容介紹了“javascript的this關鍵字定義和用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

this的定義

  表示當前執行代碼的環境對象

  因此可將this的剖析分為“全局環境”和“函數環境”兩種類型的環境對象

  全局環境

  console.log(this===window);//true

  vara=10;

  console.log(this.a);//10

  函數環境

  在函數內部,this的取值取決于函數被調用時的運行環境。

  這里涉及到內存里的數據結構相關的知識點,當我們定義以下字面量對象時會發生一系列的關聯關系

  varobj={name:'Tom'};

  javascript引擎會先在內存中生成{name:'Tom'}對象,接著再把這個對象的內存地址賦值給obj變量,所以obj變量保存的只是一個內存地址而已,如果要獲取obj.name,javascript引擎會先從obj變量中拿到內存地址,然后從該地址中獲取原始對象,再返回name屬性。

  而屬性值為函數時,該函數會被保存在內存中,然后將該內存地址賦值給該屬性,因此該地址賦值給不同環境執行時它的作用域是不一樣的,而this對象就是指向函數當前的執行環境對象,執行環境是會在EventLoop(事件循環)過程中變化的,因此this在函數環境下是屬于運行時的。

  varname='Tom';

  varobj={

  name:'Iceberg',

  say:function(){

  console.log('mynameis'+this.name);

  },

  sub:{

  say:function(){

  console.log('mynameis'+this.name);

  }

  }

  };

  obj.say();//mynameisIceberg

  obj.sub.say()//mynameisundefined;

  varsay=obj.say;

  say();//mynameisTom;

  上面的例子說明obj.say()執行環境為obj對象,而obj.sub.say()的執行環境卻是obj.sub對象,而對于obj.sub來說并沒有name屬性,因此為undefined;而varsay=obj.say;則表示將say方法的內存地址賦值給全局變量,因此從全局變量name中取值。

  運用場景

  接下來從this在函數環境下的不同運用場景來剖析

  事件回調函數

  varhandler={

  nickname:'anonymous',

  register:function(){

  console.log(this.nickname);

  }

  }

  $('#registerBtn').on('click',handler.register);//undefined

  以上邏輯點擊觸發后輸出的是undefined,因為函數被當做事件觸發的回調函數執行時,this是指向該觸發事件對應的元素,如要this仍然以handler對象為執行環境,則可使用函數的bind方法進行執行環境對象的綁定操作。

  $('#registerBtn').on('click',handler.register.bind(handler));//anonymous

  在react中經常需要在回調函數中調用this.state、this.props,按照上面的分析,將當前環境對象bind到回調函數中即可。

  如果是使用的箭頭函數定義回調函數即可無需bind,因為箭頭函數中this就是對應定義時所在的對象。

  構造函數

  要理解this在構造函數中的邏輯就要理清楚構造函數在實例化過程中都發生了什么。

  functionA(){

  this.name='Tom';

  this.age=20;

  }

  vara=newA();

  使用new命令實例化構造函數A的過程中會發生以下流程

  創建一個空對象,作為將要返回的對象實例

  將該空對象的原型指向構造函數的prototype屬性

  將該空對象賦值給構造函數內部的this關鍵字

  執行構造函數內部代碼

  默認返回this對象(如return的為非對象類型,如數字123,會被忽略進而默認returnthis對象)

  由以上邏輯可知道this關鍵字在構造函數中表示的是其實例對象。

  bind

  bind方法將函數體中的this指向新對象并返回一個新函數

  functionA(){

https://www.ryw168.com/news/cases/14912.html

  this.nickname='Tom';

  this.say=function(){

  console.log(this.nickname);

  }

  }

  varb={nickname:'John'};

  vara=newA();

  varsay=a.say;

  varsay1=a.say.bind(a);

  varsay2=a.say.bind(b);

  say();//undefined

https://www.ryw168.com/news/cases/14913.html

  say1();//Tom

  say2();//John

  call&apply

  call方法是指Function.prototype.call,因此每個函數都會具備call方法,fun.call(thisArg,arg1,arg2,...),call方法接收的第一個參數會替換原有的this指向的執行環境對象。

  functionA(){

  this.name='Tom';

  this.sayName=function(){

  console.log(this.name);

  };

  }

  functionB(){

  this.name='John';

  }

  vara=newA();

  a.sayName.call(newB());//John

  而apply方法與call的區別僅在于call接收參數列表而apply接收數組參數或者類數組對象(如函數的arguments對象)。

  總結

  由于javascript的EventLoop原理,決定了執行上下文會不斷變化,因此this對象誕生于表達當前的執行環境對象。

“javascript的this關鍵字定義和用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

额济纳旗| 介休市| 凤翔县| 香港| 三江| 邹平县| 桑植县| 五大连池市| 大连市| 潮州市| 盐池县| 赣榆县| 上杭县| 漳州市| 东明县| 洛宁县| 鹤峰县| 靖西县| 内黄县| 和顺县| 高碑店市| 通化市| 扎兰屯市| 香港| 革吉县| 龙门县| 江都市| 花莲市| 开江县| 漯河市| 韩城市| 蒙山县| 藁城市| 洞口县| 尖扎县| 拜泉县| 钟山县| 班戈县| 安福县| 雷波县| 泾阳县|