内置[[Call]]和[[Construct]]算法,了解

时间:2018-04-03 05:08:28

标签: javascript ecmascript-6

  

9.3.1 [[Call]](thisArgument,argumentsList)

     
      
  1. 让结果为完成记录,它是以符合实现定义的方式评估F的结果   F. thisArgument的规范就是这个值,argumentsList   提供命名参数,NewTarget值未定义。
  2.         

    9.3.2 [[Construct]](argumentsList,newTarget)

         
        
    1. 让结果为完成记录,它是以符合实现定义的方式评估F的结果   F.的规范。这个值是未初始化的argumentsList   提供命名参数,newTarget提供NewTarget   值。
    2.   

您能解释一下这些提案的含义吗?我知道Completion Record是什么。如何理解句子的这一部分:result of evaluating F in an implementation-defined manner that conforms to the specification of F

1 个答案:

答案 0 :(得分:2)

  

以符合F

规范的实现定义方式评估F的结果

一开始,此行位于section 9.3.1section 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是实现定义的。步骤是

  
      
  1. 让P成为? ToPropertyKey(V)。
  2.   
  3. 让O成为? ToObject(此值)。
  4.   
  5. 回来? HasOwnProperty(O,P)。
  6.   

但是这些步骤在引擎中实际执行的方式并不重要,只要它们发生。