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

Javascript 与ECMAScript语言规范函数调用部分混淆,javascript,ecma262,Javascript,Ecma262,我正在阅读ECMAScript语言规范 有人能为我重新措辞或详细解释以下句子吗 生产调用表达式: MemberExpression参数为 评价如下: 计算成员表达式 让我们以这段代码为例 var john = { name: 'John', greet: function(person) { alert("Hi " + person + ", my name is " + this.name); } }; john.greet("Mark"); 以上面的代码为

我正在阅读ECMAScript语言规范

有人能为我重新措辞或详细解释以下句子吗

生产调用表达式: MemberExpression参数为 评价如下:

  • 计算成员表达式
  • 让我们以这段代码为例

    var john = { 
      name: 'John', 
      greet: function(person) { 
        alert("Hi " + person + ", my name is " + this.name); 
      } 
    }; 
    
    john.greet("Mark");
    
    以上面的代码为例,生产CallExpression是什么意思?约翰,在这种情况下是什么意思


    谢谢

    成员表达式是
    john.greet
    。基本上它的意思是:第1步:找出要调用的函数。:-)
    john
    部分很重要,因为它是稍后才出现的

    以下是最新规范的完整引用(您的链接是到第三版,该版本已被取代;但变化不大):

  • 设ref为计算MemberExpression的结果
  • 设func为GetValue(ref)
  • 让argList作为计算参数的结果,生成参数值的内部列表(见11.2.4)
  • 如果类型(func)不是对象,则引发TypeError异常
  • 如果IsCallable(func)为false,则引发TypeError异常
  • 如果类型(ref)为参考,则
    a。如果IsPropertyReference(ref)为true,则
    一,。将此值设为GetBase(ref)。
    b。否则,ref的基础是环境记录
    一,。让thisValue成为调用GetBase(ref)的隐式thisValue具体方法的结果
  • 否则,类型(ref)不是引用。
    a。让这个值未定义
  • 返回对func调用[[Call]]内部方法的结果,提供thisValue作为this值,提供list argList作为参数值
  • 如您所见,
    john
    在6(a)处再次进入,因为表达式是一个属性引用,因此
    this
    值是
    john
    (而不是全局对象,如果您不是通过属性引用调用它,则会是这样)


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

    事实上,尝试实际阅读ECMA262规范对您的健康不利。即使对于语言律师来说,这也是令人讨厌的东西。在这种情况下,诀窍在于“评估”并不完全意味着普通程序员可能想象的结果;结果不是一个简单的值,而是仍然包含对MemberExpression
    john
    的引用的值,允许
    this
    魔法发挥作用。@bobince:Yeah.:-)好消息是,据我所知,现在第5版已经发布,团队希望改变他们对这些东西的规范,使其更易于访问。对此我说:什么,破坏了我们所有的乐趣?谢谢!一点也不好玩,就像看法律文件一样:(@Ding:是的,但没有笑声.)