gpt4 book ai didi

javascript - "target"和 "receiver"是 ES2015 规范中的同义词吗?

转载 作者:数据小太阳 更新时间:2023-10-29 05:09:39 24 4
gpt4 key购买 nike

“receiver”和“target”在 ES2015 规范(参见下面的示例)和 Web 的其他地方都使用,指代用作 this 值的对象。

这些词是同义词还是它们具有微妙的不同含义?

是否有一个正确的术语来指代函数在调用时的 this 值?

我注意到 26.1.6Reflect.get 的签名使用这两个术语表示含义不同。

这个问题源于 ES2015 规范中的命名不一致。

规范用法示例:

表 5,第 7 行([[Get]]),部分 6.1.7.2 (我的底气):

Return the value of the property whose key is propertyKey from this object. If any ECMAScript code must be executed to retrieve the property value, Receiver is used as the this value when evaluating the code.

第 2 段,第 6.1.7.2 (我的底气):

Internal method names are polymorphic. This means that different object values may perform different algorithms when a common internal method name is invoked upon them. That actual object upon which an internal method is invoked is the “target” of the invocation. If, at runtime, the implementation of an algorithm attempts to use an internal method of an object that the object does not support, a TypeError exception is thrown.

最佳答案

回顾一下:

  • 对对象内部方法的每次调用都有一个“目标”,即调用对象。

  • "Receiver"是 [[Get]] 方法的第二个nd 参数,以及[[Set]] 方法。

  • 其他 internal object methods没有这个额外的参数。

那么,为什么[[Get]][[Set]]会有Receiver呢?因为它不是目标。

Receiver用于调用[[Get]]/[[Set]]范围内的getter和setter。

ES6 9.1.8 :

  1. 您调用 A.Get( 'property', A )
  2. 如果 A 没有“属性”,则调用 A.prototype.Get( 'property', A )
    1. 目标现在是“A.prototype”。但接收者仍然是“A”。
    2. 如果 A.prototype 具有“属性”的 getter 函数,它将使用接收者 A 调用,而不是目标 A.prototype。

Note that ES5's [[Get]] (8.12.3) do the same in a different way and without Receiver, partially because prototype climbing happens in another part (8.12.2).

Receiver 仅存在于 [[Get]] 和 [[Set]] 的上下文中,并且服务于与 target 不同的目的。

  • 当[[Get]]需要引用它的目标时,它使用O。
    O 对于 [[Get]] 的每个递归调用都是不同的,因为它爬上了原型(prototype)链。

  • Receiver 与 [[Get]] 一样爬上原型(prototype)链。它的作为参数传递给getter,接下来发生的事情不再与Receiver在同一个范围内。

O and Receiver may refer to the same object, but that doesn't matter in the context of [[Get]] or [[Set]]. In fact, Reflect.get allows the caller to set a different target and Receiver and make them different from the get go.

对于其他的对象内部方法,大部分根本不爬原型(prototype)链。执行此操作的两个([[HasProperty]][[Enumerate]])不需要保留初始目标(可以这么说)。


解决了这个问题,你then ask规范是否为“Receiver”赋予了在一般 JavaScript 讨论中使用的含义,例如它如何在 6.1.7.2 中定义“target”。这个答案是否定的。

  1. “Receiver”的范围非常狭窄,仅用作参数名称,但“target”在那里以一般的、不太正式的方式使用。

  2. “目标”是从一般性讨论中借用的术语 -ES5 没有定义调用目标的概念。ES5“目标”可以是参数、变量、语句、表达式或被调用的函数。但不是 this 的隐式替换。

  3. 编写该规范是为了以非常非常精确的术语传达“JavaScript 行为”,使其非常技术化,包括参数的使用。它只是提供与一般编程讨论不同的交流方式。

    3.a.许多 JS 开发人员根本不阅读规范。 对于日常编码来说是不必要的。

    3.b.我们谈论“闭包”、“范围链”、“事件队列”和“粗箭头”或“lambda”,不是吗?规范没有定义这些术语。

    3.c.规范可能会以不同的方式命名事物,如在执行上下文或作业队列中。
    它可能根本不命名事物。关闭是一种紧急行为。
    当它命名时,它不会创建别名。箭头函数从不称为 lambda。

规范不规范一般性讨论。
使用常识进行共同讨论。

关于javascript - "target"和 "receiver"是 ES2015 规范中的同义词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37644517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com