我需要帮助理解该算法:
[[调用]]
当使用此值和参数列表调用Function对象F的[[Call]]内部方法时,将执行以下步骤:
- 让funcCtx成为使用F的[[FormalParameters]]内部属性的值,传递的参数List args以及10.4.3中描述的该值为函数代码建立新执行上下文的结果。
- 让结果为评估作为F [[Code]]内部属性值的FunctionBody的结果。如果F没有[[Code]]内部属性或者其值为空FunctionBody,则结果为(normal,undefined,empty)。
- 退出执行上下文funcCtx,恢复先前的执行上下文。
- 如果result.type是throw,则抛出result.value。
- 如果result.type为return,则返回result.value。
- 否则result.type必须正常。返回undefined。
醇>
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如果你投票,请解释你为什么这样做!
答案 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
首先,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。这是规范中值或语句的表达式。 完成类型的值是(类型,值,目标)形式的三元组。
result.type是什么意思,result.value?这个价值来自哪里?解释每一点
结果是完成规范类型,表单是(类型,值,目标)。