成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

yintaolaowanzi / 3412人閱讀

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

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

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

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

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

Topic1. that"s this

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

什么是this

11.1.1 The this Keyword

  

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

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

10.3 Execution Contexts

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

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

全局代碼中的this

從最簡單的開始

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

  

Set the ThisBinding to the global object.

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

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

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

函數(shù)調(diào)用表達(dá)式CallExpression的過程中,按照標(biāo)準(zhǔn)的描述,
計(jì)算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è))的表達(dá)式計(jì)算的結(jié)果

引用類型常見的有

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

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

屬性訪問Property Accessors
包括點(diǎn)運(yùn)算和[]運(yùn)算,引用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,就只有屬性訪問一種辦法而已。

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

new表達(dá)式時(shí)提供的this值

new表達(dá)式NewExpression的執(zhí)行過程
基本上委托給了[[Construct]]內(nèi)部方法,我們看這個(gè)方法的定義,
關(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)部方法時(shí),我們看標(biāo)準(zhǔn)

  

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在此時(shí)會綁定為全局對象

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

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

That"s this in Javascript.

本節(jié)思考題:

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

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

with語句并不是一個(gè)良好的實(shí)踐,所以我避開了它,不過這可以作為閱讀標(biāo)準(zhǔn)的練習(xí):with語句如何影響this關(guān)鍵詞?請?jiān)囍鴮懸痪浯a展示此種影響

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

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.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ù)略有不同,其功能完全一樣。它們的第一個(gè)參數(shù)都為將要指向的對象。 關(guān)于 this 在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了this的值。this不能在執(zhí)行期間被賦值,并且在每次函數(shù)被調(diào)用時(shí)this的值也可能會不同。 全局 this window.something = ...

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

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

    galaxy_robot 評論0 收藏0
  • ECMAScript 2018 標(biāo)準(zhǔn)導(dǎo)讀

    摘要:標(biāo)準(zhǔn)對象,語義由本規(guī)范定義的對象。三個(gè)冒號作為分隔符分割數(shù)字字符串文法的產(chǎn)生式。所有因?yàn)閹淼膯栴},基本上是占著茅坑不拉屎的行為導(dǎo)致。以數(shù)組測試操作為例,標(biāo)準(zhǔn)中的描述如下相對于來說,規(guī)范中增加了對的處理。 前言 本文是對《ECMAScript 2018 Language Specification》的解讀。本文是對標(biāo)準(zhǔn)的概述性導(dǎo)讀,不是對 ES2018特性的詳細(xì)描述,也不會針對某個(gè)技術(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)景后來所有的瀏覽器中以及微軟之后的版本中。年月,這份標(biāo)準(zhǔn)采用快速程序提交給,并被核準(zhǔn)成為國際標(biāo)準(zhǔn)。標(biāo)準(zhǔn)第三版在年月會議上通過并在年月作為標(biāo)準(zhǔn)發(fā)布。 ECSA-262標(biāo)準(zhǔn)第六版/2015年6月 ECMAScript 2015語言規(guī)范 這是 ECMA-262 第六版,ECMAScript 2015 語言規(guī)范 HTM...

    blair 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<