国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

簡單易懂的ECMA規(guī)范導(dǎo)讀1 that's this

yintaolaowanzi / 3335人閱讀

摘要:本文不是標準的中文翻譯,也不是的入門教程,本文雖然以的常見問題切入,但并不適合想要快速了解這些問題的人才是快速了解問題的正解。盡量以英文原版為基礎(chǔ),為了流暢,可能會使用某些名詞的中文翻譯,但會將匹配的英文名詞以此種樣式中出現(xiàn)一次以避免誤解。

簡單易懂的ECMA規(guī)范導(dǎo)讀1

最近混SF,恰巧又逢工作方面有了NodeJS的機會,迫切地有教別人怎么寫JS的需求,
我發(fā)現(xiàn)JS這個東西其實真沒那么容易理解。

為了加深和糾正自己對JS的理解,也為了以后能直接甩別人一臉文章,所以開始挖這樣一個大坑:簡單易懂的ECMA規(guī)范導(dǎo)讀
希望能以專題的形式有線索地基于ECMA標準介紹Javascript的方方面面。本文不是ECMA標準的中文翻譯,也不是Javascript的入門教程,
本文雖然以JS的常見問題切入,但并不適合想要快速了解這些問題的人(Google才是快速了解問題的正解)。
本文的聚焦于標準如何決定了JS的各種行為,JS引擎的水面下在發(fā)生些什么。

本文描述的是ECMA262的5.1版本 也是現(xiàn)在最為流行和主流的標準,
現(xiàn)代瀏覽器和NodeJS默認均遵循此標準。盡量以英文原版為基礎(chǔ),為了流暢,可能會使用某些名詞的中文翻譯,
但會將匹配的英文名詞以此種樣式中出現(xiàn)一次以避免誤解。

Topic1. that"s this

我們的第一個話題是:this指向哪里?

什么是this

11.1.1 The this Keyword

  

The this keyword evaluates to the value of the ThisBinding of the current execution context.

計算this關(guān)鍵字時,取當前執(zhí)行上下文的ThisBinding的值

10.3 Execution Contexts

執(zhí)行上下文Execution Context 從邏輯上形成棧結(jié)構(gòu),棧頂(活躍)的執(zhí)行上下文包含了追蹤當前正在執(zhí)行的代碼的全部狀態(tài)。

執(zhí)行上下文包含了LexicalEnvironment、VariableEnvironment和ThisBinding三部分,在這個話題中我們主要關(guān)心ThisBinding,
也就是代碼中出現(xiàn)this所代指的值的綁定

全局代碼中的this

從最簡單的開始

10.4.1 Entering Global Code
在進入全局代碼的流程中,規(guī)范明確指出:全局代碼對應(yīng)的執(zhí)行上下文中,

  

Set the ThisBinding to the global object.

所以全局代碼中,this指向全局對象

函數(shù)調(diào)用表達式時提供的this值

注意:this值this value是不同于this關(guān)鍵詞的概念,是調(diào)用[[Call]]內(nèi)部方法的參數(shù)之一,并不等同于用戶代碼中的this關(guān)鍵字

函數(shù)調(diào)用表達式CallExpression的過程中,按照標準的描述,
計算this值的偽代碼如下

if Type(ref) is 
    if IsPropertyReference(ref)
        thisValue := getBase(ref)
    else # assert Type(getBase(ref)) is 
        thisValue := getBase(ref).ImplicitThisValue()
else
    thisValue := undefined

ref是函數(shù)調(diào)用參數(shù)左側(cè)(括號左側(cè))的表達式計算的結(jié)果

引用類型常見的有

標示符引用Identifier Reference
即變量引用,引用base是環(huán)境記錄Environment Record

字面量引用Literal Reference
引用base也是環(huán)境記錄

屬性訪問Property Accessors
包括點運算和[]運算,引用base是左值

非引用類型常見的有

全部ECMA內(nèi)置函數(shù)和所有用戶定義函數(shù)的返回結(jié)果(例外是host objects,也就是假設(shè)DOM之類的宿主對象如果需要,
可以定義一些函數(shù)返回引用)

環(huán)境記錄是前述的執(zhí)行上下文中的LexicalEnvironment和VariableEnvironment的構(gòu)成要素

不考慮with語句的話,環(huán)境記錄只有Declarative Environment Records一種,它的ImplicitThisValue始終返回undefined

綜上所述,排除with語句的情況下,想讓thisValue不是undefined,就只有屬性訪問一種辦法而已。

計算得到thisValue后,調(diào)用被調(diào)函數(shù)func的[[call]]內(nèi)部方法,提供thisValue作為this的值

new表達式時提供的this值

new表達式NewExpression的執(zhí)行過程
基本上委托給了[[Construct]]內(nèi)部方法,我們看這個方法的定義,
關(guān)注其中第8步

  

Let result be the result of calling the [[Call]] internal property of F, providing
obj as the this value and providing the argument list passed into [[Construct]] as args.

其中F是構(gòu)造函數(shù),而obj是本次新建的對象,非常清楚。

this值如何轉(zhuǎn)變?yōu)門hisBinding

前兩節(jié)我們描述了兩種觸發(fā)函數(shù)體內(nèi)代碼的辦法各自如何構(gòu)造this值,但正如前述,this關(guān)鍵字的值是執(zhí)行上下文中的ThisBinding決定的,
this值轉(zhuǎn)變?yōu)門hisBinding的過程發(fā)生在調(diào)用[[Call]]內(nèi)部方法時,我們看標準

  

Let funcCtx be the result of establishing a new execution context for function
code using the value of F"s [[FormalParameters]] internal property, the passed
arguments List args, and the this value as described in 10.4.3.

阿哈,第一步就是建立新的執(zhí)行上下文,其中thisBinding的構(gòu)建在10.4.3 Entering Function Code
中描述,

if function-code is 
    ThisBinding = thisArg
else if thisArg is null or thisArg is undefined
    ThisBinding = global object
else if Type(thisArg) is not 
    ThisBinding = ToObject(thisArg)
else
    ThisBinding = thisArg


這就是魔術(shù)的秘密

null 和 undefined 的this在此時會綁定為全局對象

其他三種非對象 String / Boolean / Number 在此時被轉(zhuǎn)化為對象(auto boxing)

但是,strict mode下不進行任何轉(zhuǎn)換

That"s this in Javascript.

本節(jié)思考題:

找找看關(guān)于apply和call的標準,為何this會變?

找找看關(guān)于bind的標準,哪里體現(xiàn)了bind后的函數(shù)內(nèi)的this無視環(huán)境和調(diào)用方式,總是固定值?

with語句并不是一個良好的實踐,所以我避開了它,不過這可以作為閱讀標準的練習(xí):with語句如何影響this關(guān)鍵詞?請試著寫一句代碼展示此種影響

eval的內(nèi)部的this如何確定?

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/78089.html

相關(guān)文章

  • Brief introduction of how to 'Call, Apply and

    摘要:關(guān)于在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了的值。不能在執(zhí)行期間被賦值,并且在每次函數(shù)被調(diào)用時的值也可能會不同。它們除了參數(shù)略有不同,其功能完全一樣。它們的第一個參數(shù)都為將要指向的對象。 關(guān)于 this 在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了this的值。this不能在執(zhí)行期間被賦值,并且在每次函數(shù)被調(diào)用時this的值也可能會不同。 全局 this window.something = ...

    incredible 評論0 收藏0
  • [譯]Understanding javascript's 'undefined

    摘要:一個表示編譯器檢測到一個無效的引用值。在實際情況中,往往是在獲取一個未被賦值的引用時被拋出。任何一個函數(shù)上下文都有一個被稱為活動對象的變量對象。沒有找到的話,就會認為引用名沒有基礎(chǔ)值并拋出的錯誤。下沒有下的屬性僅存在于被啟動的情況下。 和其他語言相比,javascript中的對于undefined的理解還是有點讓人困惑的。特別是試著理解ReferenceErrors錯誤(x is no...

    galaxy_robot 評論0 收藏0
  • ECMAScript 2018 標準導(dǎo)讀

    摘要:標準對象,語義由本規(guī)范定義的對象。三個冒號作為分隔符分割數(shù)字字符串文法的產(chǎn)生式。所有因為帶來的問題,基本上是占著茅坑不拉屎的行為導(dǎo)致。以數(shù)組測試操作為例,標準中的描述如下相對于來說,規(guī)范中增加了對的處理。 前言 本文是對《ECMAScript 2018 Language Specification》的解讀。本文是對標準的概述性導(dǎo)讀,不是對 ES2018特性的詳細描述,也不會針對某個技術(shù)...

    MiracleWong 評論0 收藏0
  • Node.js中Object與Function在ECMA 規(guī)范關(guān)系

    摘要:一規(guī)范中二規(guī)范中三規(guī)范中四分析過程分析五證明流程 Why in JavaScript both Object instanceof Function and Function instanceof Object return true? 一、ECMA5.1規(guī)范中instanceof /* how instanceof is defined by ECMA 5.1 Specificati...

    LdhAndroid 評論0 收藏0
  • es6

    摘要:只要上述版權(quán)通知版權(quán)許可和免責(zé)聲明均包含在所有此類副本和衍生物中。它應(yīng)用于網(wǎng)景后來所有的瀏覽器中以及微軟之后的版本中。年月,這份標準采用快速程序提交給,并被核準成為國際標準。標準第三版在年月會議上通過并在年月作為標準發(fā)布。 ECSA-262標準第六版/2015年6月 ECMAScript 2015語言規(guī)范 這是 ECMA-262 第六版,ECMAScript 2015 語言規(guī)范 HTM...

    blair 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<