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

首頁 > 編程 > JavaScript > 正文

深入淺析JavaScript系列(13):This? Yes,this!

2019-11-20 10:51:27
字體:
來源:轉載
供稿:網友

前言

在這篇文章里,我們將討論跟執行上下文直接相關的更多細節。討論的主題就是this關鍵字。實踐證明,這個主題很難,在不同執行上下文中this的確定經常會發生問題。

許多程序員習慣的認為,在程序語言中,this關鍵字與面向對象程序開發緊密相關,其完全指向由構造器新創建的對象。在ECMAScript規范中也是這樣實現的,但正如我們將看到那樣,在ECMAScript中,this并不限于只用來指向新創建的對象。

英文翻譯: Dmitry A. Soshnikov在Stoyan Stefanov的幫助下發布: 2010-03-07http://dmitrysoshnikov.com/ecmascript/chapter-3-this/俄文原文: Dmitry A. Soshnikov修正: Zeroglif發布: 2009-06-28; 更新:2010-03-07http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/本文絕大部分內容參考了:http://www.denisdeng.com/?p=900部分句子參考了:justin的中文翻譯

讓我們更詳細的了解一下,在ECMAScript中this到底是什么?

定義

this是執行上下文中的一個屬性:

activeExecutionContext = { VO: {...}, this: thisValue};

這里VO是我們前一章討論的變量對象。

this與上下文中可執行代碼的類型有直接關系,this值在進入上下文時確定,并且在上下文運行期間永久不變。

下面讓我們更詳細研究這些案例:

全局代碼中的this

在這里一切都簡單。在全局代碼中,this始終是全局對象本身,這樣就有可能間接的引用到它了。

// 顯示定義全局對象的屬性this.a = 10; // global.a = 10alert(a); // 10 // 通過賦值給一個無標示符隱式b = 20;alert(this.b); // 20 // 也是通過變量聲明隱式聲明的// 因為全局上下文的變量對象是全局對象自身var c = 30;alert(this.c); // 30

函數代碼中的this

在函數代碼中使用this時很有趣,這種情況很難且會導致很多問題。

這種類型的代碼中,this值的首要特點(或許是最主要的)是它不是靜態的綁定到一個函數。

正如我們上面曾提到的那樣,this是進入上下文時確定,在一個函數代碼中,這個值在每一次完全不同。

不管怎樣,在代碼運行時的this值是不變的,也就是說,因為它不是一個變量,就不可能為其分配一個新值(相反,在Python編程語言中,它明確的定義為對象本身,在運行期間可以不斷改變)。

var foo = {x: 10}; var bar = { x: 20, test: function () { alert(this === bar); // true alert(this.x); // 20 this = foo; // 錯誤,任何時候不能改變this的值 alert(this.x); // 如果不出錯的話,應該是10,而不是20 } }; // 在進入上下文的時候// this被當成bar對象// determined as "bar" object; why so - will// be discussed below in detail bar.test(); // true, 20 foo.test = bar.test; // 不過,這里this依然不會是foo// 盡管調用的是相同的function foo.test(); // false, 10 

那么,影響了函數代碼中this值的變化有幾個因素:

首先,在通常的函數調用中,this是由激活上下文代碼的調用者來提供的,即調用函數的父上下文(parent context )。this取決于調用函數的方式。

為了在任何情況下準確無誤的確定this值,有必要理解和記住這重要的一點。正是調用函數的方式影響了調用的上下文中的this值,沒有別的什么(我們可以在一些文章,甚至是在關于javascript的書籍中看到,它們聲稱:“this值取決于函數如何定義,如果它是全局函數,this設置為全局對象,如果函數是一個對象的方法,this將總是指向這個對象。

主站蜘蛛池模板: 东丽区| 和顺县| 连城县| 侯马市| 长岛县| 潜山县| 乡宁县| 台东县| 宁城县| 精河县| 天等县| 都兰县| 胶南市| 来凤县| 西和县| 平南县| 汪清县| 兰考县| 英山县| 叙永县| 红河县| 云安县| 大竹县| 新津县| 文安县| 金塔县| 阳城县| 庄浪县| 鸡西市| 黄龙县| 乌拉特中旗| 远安县| 静海县| 曲沃县| 进贤县| 勃利县| 巴林左旗| 丰镇市| 郁南县| 盘山县| 泗阳县|