阅读本文请先查看执行上下文
规范定义:
this 关键字: 返回 ResolveThisBinding()
ResolveThisBinding
- 定义
envRec
为 GetThisEnvironment() - 返回
envRec
.GetThisBinding()
GetThisEnvironment
-
定义
env
为 running execution context 的 LexicalEnvironment -
重复以下步骤直到返回
env
-
定义
exists
为env. HasThisBinding()
-
如果
exists
是true
, 返回env
-
定义
outer
为env.[[OuterEnv]]
这里体现了箭头函数this
为什么总是指向外层 -
设置
env
为outer
只有function Environment Record(非箭头函数), module Environment Record 以及 global Environment Record的 HasThisBinding()
返回 true
, 其它为 false
GetThisBinding
对于 HasThisBinding()
返回 true
的情况, GetThisBinding
执行结果如下:
-
function Environment Record(非箭头函数)
[[ThisBindingStatus]]
非uninitialized
, 返回[[ThisValue]]
,[[ThisValue]]
与[[ThisMode]]
有关 参考
[[ThisMode]]
包含以下 3 种可能-
lexical
箭头函数 (这里是非箭头函数, 所以不考虑) -
strict
严格模式, 函数调用时提供, 没有this
为undefined
-
global
非严格模式, 当this
为undefined
或null
,this
绑定到 global object
-
-
module Environment Record
undefined
-
global Environment Record
返回[[GlobalThisValue]]
, 即全局作用域的this
非箭头函数 this
规范规定了Left-Hand-Side Expressions
结构的函数代码执行时的语义(词法)分析
规范规定函数右边部分如下:
分析下面代码:
const obj = {
func: function () {
console.log(this);
}
}
obj.func();
(false || obj.func)();
obj.func() 分析
obj.func()
的左边部分是 obj.func
, 这是一个 MemberExpression
, 其解析过程请参考规范内容, 解析结果为:
Reference Record { [[Base]]: obj, [[ReferencedName]]: 'func', [[Strict]]: 是否为严格模式, [[ThisValue]]: empty }.
请阅读: Reference Record
规范表明,这种表达式的 this
取决于左边内容返回的是 ECMAScript language value 还是 Reference Record
obj.func
返回 Reference Record, 所以 this 值为 Reference Record[[Base]], 即 obj
这里只简单介绍了一下判断, 具体请参考EvaluateCall
(false || obj.func)() 分析
左边部分是 (false || obj.func), 这是个 LogicalORExpression, 规范定义了其执行过程, 可以知道, 返回值为 ECMAScript language value(obj.func指向的函数对象), 不是 Reference Record, 所以 this 为 undefined (非严格模式下会指向全局对象)