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

首頁 > 開發 > JS > 正文

javascript的this關鍵字詳解

2024-05-06 16:51:07
字體:
來源:轉載
供稿:網友

this 的定義

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

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

全局環境

console.log(this === window); // true var a = 10;console.log(this.a); // 10

函數環境

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

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

var obj = { name: 'Tom' };

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

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

var name = 'Tom'; var obj = {  name: 'Iceberg',  say: function() {    console.log('my name is ' + this.name);  },  sub: {    say: function() {      console.log('my name is ' + this.name);    }  }}; obj.say(); // my name is Icebergobj.sub.say() // my name is undefined; var say = obj.say;say(); // my name is Tom;

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

運用場景

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

事件回調函數

var handler = {	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 在構造函數中的邏輯就要理清楚構造函數在實例化過程中都發生了什么。

function A() {  this.name = 'Tom';  this.age = 20;}var a = new A();

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

  1. 創建一個空對象,作為將要返回的對象實例
  2. 將該空對象的原型指向構造函數的 prototype 屬性
  3. 將該空對象賦值給構造函數內部的 this 關鍵字
  4. 執行構造函數內部代碼
  5. 默認返回 this 對象(如 return 的為非對象類型,如數字 123,會被忽略進而默認 return this 對象)
  6. 由以上邏輯可知道 this 關鍵字在構造函數中表示的是其實例對象。

bind

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

function A() {  this.nickname = 'Tom';  this.say = function() {    console.log(this.nickname);  }}var b = { nickname: 'John' };var a = new A();var say = a.say;var say1 = a.say.bind(a);var say2 = a.say.bind(b);say(); // undefinedsay1(); // Tomsay2(); // John

call & apply

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

function A() {  this.name = 'Tom';  this.sayName = function(){    console.log(this.name);  };} function B() {  this.name = 'John';} var a = new A();a.sayName.call(new B()); // John

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

總結

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

以上所述是小編給大家介紹的javascript的this關鍵字的用法詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲区在线播放| www.久久草.com| 成人黄色免费看| 全球成人中文在线| 欧美日韩国产91| 久久影院资源站| 欧美亚洲在线播放| 国产精品久久久久福利| 国产在线不卡精品| 久久久精品国产| 亚洲精品午夜精品| 日韩乱码在线视频| 在线日韩日本国产亚洲| 久热精品视频在线观看一区| 欧美性猛交xxxx乱大交| 最近日韩中文字幕中文| 性欧美亚洲xxxx乳在线观看| 日韩国产精品一区| 欧洲精品久久久| 日韩欧美亚洲成人| 一区二区中文字幕| 亚洲成人精品视频| 91在线色戒在线| 亚洲三级 欧美三级| 欧美激情手机在线视频| 欧美大奶子在线| 日韩精品在线影院| 欧美激情视频三区| 亚洲黄色www| 日韩在线欧美在线| 日韩精品极品视频免费观看| 日韩在线中文视频| 亚洲成人激情小说| 国产欧美日韩精品专区| 91久久精品久久国产性色也91| 亚洲精品99久久久久中文字幕| 中文字幕精品一区久久久久| 日韩精品在线观看一区二区| 成人中文字幕+乱码+中文字幕| 91精品国产综合久久香蕉的用户体验| 精品久久久久久久久久久久| 日韩高清av在线| 欧美日韩亚洲成人| 亚洲国产福利在线| 亚洲新声在线观看| 成人中心免费视频| 亚洲欧美激情一区| 亚洲第一视频在线观看| 亚洲人成电影网站色…| 亚洲人成网站在线播| 国产91网红主播在线观看| 人人爽久久涩噜噜噜网站| 国内精品久久久久伊人av| 国产成人97精品免费看片| 欧美久久精品午夜青青大伊人| 日韩电影大全免费观看2023年上| 色悠久久久久综合先锋影音下载| 久色乳综合思思在线视频| 97人洗澡人人免费公开视频碰碰碰| 亚洲日韩中文字幕| 亚洲少妇中文在线| 久久精品国产91精品亚洲| 在线色欧美三级视频| 92国产精品视频| 日韩av大片在线| 中文字幕日韩电影| 久久久国产精品x99av| 2019中文字幕在线| 国产精品视频网址| 欧美疯狂xxxx大交乱88av| 亚洲自拍高清视频网站| 日韩欧美在线观看| 亚洲三级免费看| 中国日韩欧美久久久久久久久| 欧美视频不卡中文| 日韩精品在线看| 日韩在线www| 欧美极品第一页| 日韩精品免费电影| 欧美精品性视频| 国产精品久久久久久久久久小说| 狠狠躁夜夜躁人人爽天天天天97| 欧美成人免费播放| 热99精品只有里视频精品| 国产日产久久高清欧美一区| 亚洲电影免费观看高清| 欧美综合国产精品久久丁香| 亚洲aaa激情| 欧洲亚洲免费视频| 伊人亚洲福利一区二区三区| 91精品久久久久久久久| 久久精品国产久精国产一老狼| 亚洲欧洲美洲在线综合| 亚洲va久久久噜噜噜| 黑人精品xxx一区一二区| 日韩精品中文在线观看| 91九色视频导航| 国产亚洲视频中文字幕视频| 亚洲女成人图区| 国产精品2018| 欧美夜福利tv在线| 欧美日韩国产精品一区二区不卡中文| 中文字幕不卡在线视频极品| 国产香蕉97碰碰久久人人| 亚洲久久久久久久久久久| 自拍偷拍免费精品| 亚洲高清福利视频| 欧美自拍视频在线观看| 性色av一区二区三区免费| 欧美激情一区二区三区高清视频| 538国产精品一区二区在线| 亚洲国产日韩精品在线| 国产精品无av码在线观看| 日韩精品在线视频观看| 国产精品黄色影片导航在线观看| 国产欧美精品日韩| 2025国产精品视频| 欧美亚洲视频在线观看| 日韩成人在线电影网| 欧美午夜丰满在线18影院| 亚洲成人av在线| 精品网站999www| 国产精品久久久久久久电影| 久久夜精品va视频免费观看| 日韩av电影手机在线观看| 日韩欧美中文字幕在线观看| 久久久噜噜噜久久中文字免| 爱福利视频一区| 97久久久免费福利网址| 免费91麻豆精品国产自产在线观看| 欧美激情中文网| 久久久久久欧美| 久久精品视频播放| 日韩亚洲欧美中文在线| 欧美亚洲在线观看| 成人av资源在线播放| 在线观看欧美视频| 国产日韩在线精品av| 久久福利视频导航| 国产精品第一区| 日本一区二区三区四区视频| 亚洲一区二区三区视频播放| 欧美日韩一区免费| 国产精品亚洲综合天堂夜夜| 国产欧美一区二区三区在线看| 亚洲美女www午夜| 日韩欧美国产骚| 欧美成人精品一区二区三区| 欧美日韩激情小视频| 欧美精品制服第一页| 国产一区欧美二区三区| 96pao国产成视频永久免费| 91高清视频免费| 欧美日本精品在线| 欧美一级电影久久| 国产精品va在线播放我和闺蜜| 在线视频欧美日韩| 久久久国产91| 91禁国产网站| 亚洲 日韩 国产第一| 欧美丰满少妇xxxxx做受| 日韩欧美亚洲综合| 国产不卡在线观看| 亚洲精品97久久|