JS - 规范下的 this

本文详细探讨了JavaScript中this关键字的规范定义,解释了ResolveThisBinding和GetThisBinding的过程,强调了非箭头函数中this的指向规则。在不同类型的执行环境中,如function、module和global Environment Record,this的绑定方式各有不同。举例说明了在函数调用、对象方法调用以及逻辑运算符表达式中的this取值情况。
摘要由CSDN通过智能技术生成

阅读本文请先查看执行上下文

规范定义:

this 关键字: 返回 ResolveThisBinding()

ResolveThisBinding

  1. 定义 envRecGetThisEnvironment()
  2. 返回 envRec.GetThisBinding()

GetThisEnvironment

  1. 定义 envrunning execution context 的 LexicalEnvironment

  2. 重复以下步骤直到返回 env

  3. 定义 existsenv. HasThisBinding()

  4. 如果 existstrue , 返回 env

  5. 定义 outerenv.[[OuterEnv]]
    这里体现了箭头函数 this 为什么总是指向外层

  6. 设置 envouter

只有function Environment Record(非箭头函数), module Environment Record 以及 global Environment RecordHasThisBinding() 返回 true , 其它为 false

GetThisBinding

对于 HasThisBinding() 返回 true 的情况, GetThisBinding 执行结果如下:

  • function Environment Record(非箭头函数)
    [[ThisBindingStatus]]uninitialized , 返回 [[ThisValue]] , [[ThisValue]][[ThisMode]] 有关 参考
    [[ThisMode]] 包含以下 3 种可能

    • lexical
      箭头函数 (这里是非箭头函数, 所以不考虑)

    • strict
      严格模式, 函数调用时提供, 没有 thisundefined

    • global
      非严格模式, 当 thisundefinednull , 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 (非严格模式下会指向全局对象)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值