9.3.1 [[Call]](thisArgument,argumentsList)
- 让结果为完成记录,它是以符合实现定义的方式评估F的结果 F. thisArgument的规范就是这个值,argumentsList 提供命名参数,NewTarget值未定义。
醇>9.3.2 [[Construct]](argumentsList,newTarget)
- 让结果为完成记录,它是以符合实现定义的方式评估F的结果 F.的规范。这个值是未初始化的argumentsList 提供命名参数,newTarget提供NewTarget 值。
醇>
您能解释一下这些提案的含义吗?我知道Completion Record
是什么。如何理解句子的这一部分:result of evaluating F in an implementation-defined manner that conforms to the specification of F
答案 0 :(得分:2)
以符合
规范的实现定义方式评估F
F
的结果
一开始,此行位于section 9.3.1和section 9.3.2。在此考虑上下文非常重要。如果你看the summary of section 9.3
本规范中定义的内置函数对象可以实现为ECMAScript函数对象(9.2),其行为使用ECMAScript代码提供,或者实现为函数异常对象,其行为以某种其他方式提供。在任何一种情况下,调用这些函数的效果必须符合它们的规范。
这是关键部分。当您的引用行显示“实现定义”时,它指的是这里。
例如,函数可以用C ++或JS引擎正在执行的任何其他语言实现。所需要的只是该函数执行规范指定的操作。然而,它不必在JS本身中实现。
如果规范描述了这一点,那么评估的描述在哪里?
由于本节是关于“内置函数”的,因此这里的行为是规范定义JS函数行为的任何地方。例如,如果我们查看section 17,则说明:
除非另有说明,否则本规范中定义的每个内置函数都是通过调用CreateBuiltinFunction抽象操作(9.3.3)创建的。
因此规范中定义的任何函数都具有此实现定义的行为。例如,Object.prototype.hasOwnProperty
是实现定义的。步骤是
- 让P成为? ToPropertyKey(V)。
- 让O成为? ToObject(此值)。
- 回来? HasOwnProperty(O,P)。
醇>
但是这些步骤在引擎中实际执行的方式并不重要,只要它们发生。