ECMAScript 5.1内部方法[[Call]]

时间:2018-01-07 02:48:01

标签: ecmascript-5

我需要帮助理解该算法:

  

[[调用]]

     

当使用此值和参数列表调用Function对象F的[[Call]]内部方法时,将执行以下步骤:

     
      
  1. 让funcCtx成为使用F的[[FormalParameters]]内部属性的值,传递的参数List args以及10.4.3中描述的该值为函数代码建立新执行上下文的结果。
  2.   
  3. 让结果为评估作为F [[Code]]内部属性值的FunctionBody的结果。如果F没有[[Code]]内部属性或者其值为空FunctionBody,则结果为(normal,undefined,empty)。
  4.   
  5. 退出执行上下文funcCtx,恢复先前的执行上下文。
  6.   
  7. 如果result.type是throw,则抛出result.value。
  8.   
  9. 如果result.type为return,则返回result.value。
  10.   
  11. 否则result.type必须正常。返回undefined。
  12.   

https://www.ecma-international.org/ecma-262/5.1/#sec-13.2.1

我需要在2,4,5,6条款中解释。

关于2:首先,FunctionBody计算的结果是什么意思?它是如何计算的?当发生这种情况时,没有[[Code]]属性是什么意思?最重要的是,这个记录意味着什么(正常,未定义,空白)。

关于4,5,6:result.type是什么意思,result.value?这个价值来自哪里?解释每一点

P.S如果你投票,请解释你为什么这样做!

1 个答案:

答案 0 :(得分:0)

首先,[[Call]]是关于Function.prototype.call()的,所以最好先理解call(),因为它比算法更容易。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

我从MDN获取此示例代码,并尝试粗略回答这个问题。 (如果你想详细了解,你和我必须了解整个规范,但我不了解!)

function greet() {
  var reply = [this.person, 'Is An Awesome', this.role].join(' ');
  console.log(reply);
}

var obj = {
  person: 'Douglas Crockford', role: 'Javascript Developer'
};

greet.call(obj);  // Douglas Crockford Is An Awesome Javascript Developer

约2

  

首先,FunctionBody计算的结果是什么意思?

FunctionBody是函数的代码。从示例中,FunctionBody位于下方。

var reply = [this.person, 'Is An Awesome', this.role].join(' ');
console.log(reply);

the result of the FunctionBody calculation是代码执行的结果。结果用完成规范类型表示(下面说明)。它包含函数return值,但具有更广泛的信息。

  

发生这种情况时,没有[[Code]]属性是什么意思?

这意味着空功能如下。

function greet() {
    // empty
}
  

最重要的是,这个记录意味着什么(正常,未定义,空白)。

这是Completion Specification Type。这是规范中值或语句的表达式。 完成类型的值是(类型,值,目标)形式的三元组。

约4,5,6

  

result.type是什么意思,result.value?这个价值来自哪里?解释每一点

结果是完成规范类型,表单是(类型,值,目标)