[ECMAScript] Lexical Environment

1. Lexical Environment與Environment Record

從ECMAScript規(guī)范 Executable Code and Execution Contexts這一章,我們知道,

一個(gè)Lexical Environment是一個(gè)規(guī)范內(nèi)置的類型(specification type),
它包括兩個(gè)字段,Environment Record,還有一個(gè)指向外層Lexical Environment的可空引用。

Lexical Environment一般分為global environment,module environment,以及function environment。


Environment Record可以用一個(gè)抽象類來(lái)實(shí)現(xiàn),
它包括3個(gè)子類:declarative Environment Record,object Environment Record,global Environment Record。
declarative Environment Record又有兩個(gè)子類:
function Environment Records和module Environment Records


其中,declarative Environment Record用來(lái)解決,函數(shù)聲明,變量聲明,catch語(yǔ)句中的標(biāo)識(shí)符解析問(wèn)題。object Environment Record用來(lái)解決,with語(yǔ)句中的標(biāo)識(shí)符解析問(wèn)題。

function Environment Records是declarative Environment Record的一種,
在函數(shù)體被執(zhí)行之前會(huì)初始化一個(gè)新的function Environment Record,
function Environment Records或者會(huì)或者不會(huì)建立一個(gè)新的this綁定,
如果是arrow function,就不建立新的this綁定,
如果是function,就建立新的this綁定。

注:
如果是arrow function,就不建立新的this綁定,而是使用外層的this綁定
這一點(diǎn)沒(méi)有顯式說(shuō)明,只是看到HasThisBinding會(huì)返回false,
GetThisBinding也只會(huì)處理不是arrow function的情況。

關(guān)于arrow function處理this的方式,在這里被不明顯的提到,
14.2.16Runtime Semantics: Evaluation

因此,要判斷arrow function中this的指向,要看外層Lexical Environment中this是什么。


2. BlockStatement

我們考慮BlockStatement,看看語(yǔ)句塊是怎樣建立declarative Environment Record的,
以及里面的this如何解析。

于是,我們應(yīng)該看這里,
13.2.13Runtime Semantics: Evaluation

其中調(diào)用了,NewDeclarativeEnvironment
創(chuàng)建了一個(gè)新的Lexical Environment,并初始化它的兩個(gè)字段,EnvironmentRecord以及指向外層Lexical Environment的引用。

注意,這里創(chuàng)建的是declarative Environment Record,它是function Environment Records的父類,并不會(huì)建立this綁定

因此,BlockStatement中的this,應(yīng)該與外層Lexical Environment中的this一致。

function f() {
    {
        return this;
    }
}

a = {};
alert(f.call(a) === a);  // true

參考

ECMAScript? 2017 Language Specification

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc閱讀 2,936評(píng)論 0 0
  • 黑蘋果小白一枚,折騰月余黑蘋果,終于完美在宏碁F5 安裝成功; 一開(kāi)始裝 10.11.6 完美運(yùn)行,三卡驅(qū)動(dòng),ds...
    就不能簡(jiǎn)單閱讀 3,635評(píng)論 2 0
  • 標(biāo)簽視圖控制器(UITabBarController)也是我們開(kāi)發(fā)中較為常用的一種控件,基本上現(xiàn)在發(fā)布的app中都...
    呼嚕ZR閱讀 3,126評(píng)論 0 2
  • 殺手是在吃過(guò)早餐以后發(fā)現(xiàn)門后的那張信封的,他本來(lái)想出去散散步的。信封里裝著他妻子的藍(lán)色發(fā)夾和一張紙條,紙條上只有莫...
    滕吠吠閱讀 505評(píng)論 1 4