国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

javascript的this關鍵字詳解

2024-05-06 15:39:13
字體:
來源:轉載
供稿:網友

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 就是對應定義時所在的對象。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 托克托县| 南投县| 台州市| 高陵县| 天祝| 漯河市| 天等县| 敖汉旗| 连江县| 调兵山市| 安义县| 兴山县| 梅河口市| 祥云县| 蓬溪县| 赤城县| 罗甸县| 长丰县| 辉南县| 福泉市| 麦盖提县| 竹山县| 屏东市| 馆陶县| 宝清县| 丰镇市| 崇信县| 陕西省| 塔城市| 出国| 东乡| 犍为县| 鄂尔多斯市| 和田县| 湖南省| 赤城县| 新和县| 莎车县| 麦盖提县| 顺昌县| 阳泉市|