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