与ECMAScript语言规范函数调用部分混淆

时间:2010-04-29 15:49:36

标签: javascript ecma262

我正在阅读ECMAScript语言规范Function Calls section

有人可以改写或详细解释以下对我的判断吗?

  

生产CallExpression:   MemberExpression参数是   评估如下:

     
      
  1. 评估MemberExpression。
  2.   

我们以此代码为例。

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

john.greet("Mark");

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

  
      
  1. 让ref成为评估MemberExpression的结果。
  2.   
  3. 让func为GetValue(ref)。
  4.   
  5. 让argList成为评估Arguments的结果,生成一个参数值的内部列表(见11.2.4)。
  6.   
  7. 如果Type(func)不是Object,则抛出TypeError异常。
  8.   
  9. 如果IsCallable(func)为false,则抛出TypeError异常。
  10.   
  11. 如果Type(ref)是Reference,那么   
    一个。如果IsPropertyReference(ref)为真,那么   
    我。让thisValue为GetBase(ref)。   
    湾另外,ref的基础是环境记录   
    我。设thisTalue是调用GetBase(ref)的ImplicitThisValue具体方法的结果。
  12.   
  13. 否则,Type(ref)不是Reference。   
    一个。让thisValue不确定。
  14.   
  15. 返回在func上调用[[Call]]内部方法的结果,提供thisValue作为该值,并提供列表argList作为参数值。
  16.   

如您所见,john在6(a)再次进入它,因为表达式是属性引用,因此this值为john(而不是全局对象) ,就像你通过属性引用调用而不是一样。)

如果您正在阅读规范,我建议您阅读newest one而不是旧版本(还没有HTML版本)。不过,我担心散文不会少。 : - )