1

我正在阅读 ECMAScript 语言规范函数调用部分

有人可以为我改写或详细解释以下句子吗?

产生式 CallExpression : MemberExpression Arguments 的评估如下:

  1. 评估成员表达式。

让我们以这段代码为例。

var john = { 
  name: 'John', 
  greet: function(person) { 
    alert("Hi " + person + ", my name is " + this.name); 
  } 
}; 

john.greet("Mark");

以上面的代码为例,产生式CallExpression是什么意思?在这种情况下,什么是 MemberExpression,john.greet?

谢谢!

4

1 回答 1

2

MemberExpression 是john.greet。基本上它的意思是: 第 1 步:找出要调用的函数。:-) 这john部分很重要,因为它稍后会出现。

这是最新规范的完整引用(您的链接是第 3 版,已被第5 版取代;但这并没有太大变化):

  1. 让 ref 是评估 MemberExpression 的结果。
  2. 设 func 为 GetValue(ref)。
  3. 令 argList 为评估参数的结果,生成参数值的内部列表(见 11.2.4)。
  4. 如果 Type(func) 不是 Object,则抛出 TypeError 异常。
  5. 如果 IsCallable(func) 为 false,则抛出 TypeError 异常。
  6. 如果 Type(ref) 是 Reference,那么
      a. 如果 IsPropertyReference(ref) 为真,则
        i。让 thisValue 为 GetBase(ref)。
      湾。否则, ref 的基础是环境记录
        i。令 thisValue 为调用 GetBase(ref) 的 ImplicitThisValue 具体方法的结果。
  7. 否则,Type(ref) 不是参考。
      一个。让 thisValue 未定义。
  8. 返回调用 func 的 [[Call]] 内部方法的结果,提供 thisValue 作为 this 值,提供列表 argList 作为参数值。

如您所见,john在 6(a) 处再次出现,因为表达式是属性引用,所以this值是john(而不是全局对象,如果您通过属性引用调用它,则会出现这种情况)。

如果您正在阅读规范,我建议您阅读最新的而不是旧的(还没有 HTML 版本)。不过,恐怕散文也同样浮夸。:-)

于 2010-04-29T15:54:54.707 回答