9.3.1 [[Call]](thisArgument,argumentsList)
令result为完成记录,它是按照与实现有关的实现定义的方式评估F的结果
F的规范。thisArgument是this值,argumentsList
提供命名参数,并且NewTarget值未定义。
9.3.2 [[Construct]](argumentsList,newTarget)
令result为完成记录,它是按照与实现有关的实现定义的方式评估F的结果
F的规范。this值未初始化,argumentsList
提供命名的参数,而newTarget提供NewTarget
值。
您能向我解释这些建议的含义吗?我知道Completion Record
是什么。如何理解句子的这一部分:result of evaluating F in an implementation-defined manner that conforms to the specification of F
最佳答案
以实现定义的方式符合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)。
但是这些步骤在引擎中实际执行的方式只要发生就无关紧要。