我正在阅读ECMAScript语言规范Function Calls section
有人可以改写或详细解释以下对我的判断吗?
生产CallExpression: MemberExpression参数是 评估如下:
- 评估MemberExpression。
醇>
我们以此代码为例。
var john = {
name: 'John',
greet: function(person) {
alert("Hi " + person + ", my name is " + this.name);
}
};
john.greet("Mark");
以上面的代码为例,生产CallExpression是什么意思?在这种情况下,什么是MemberExpression,john.greet?
谢谢!
答案 0 :(得分:2)
MemberExpression是john.greet
。基本上它的含义是:第1步:找出要调用的函数。 :-) john
部分很重要,因为它稍后会进入。
以下是最新规范的完整引用(您的链接是第3版,已被5th edition取代;但这并没有太大变化):
- 让ref成为评估MemberExpression的结果。
- 让func为GetValue(ref)。
- 让argList成为评估Arguments的结果,生成一个参数值的内部列表(见11.2.4)。
- 如果Type(func)不是Object,则抛出TypeError异常。
- 如果IsCallable(func)为false,则抛出TypeError异常。
- 如果Type(ref)是Reference,那么
一个。如果IsPropertyReference(ref)为真,那么
我。让thisValue为GetBase(ref)。
湾另外,ref的基础是环境记录
我。设thisTalue是调用GetBase(ref)的ImplicitThisValue具体方法的结果。- 否则,Type(ref)不是Reference。
一个。让thisValue不确定。- 返回在func上调用[[Call]]内部方法的结果,提供thisValue作为该值,并提供列表argList作为参数值。
醇>
如您所见,john
在6(a)再次进入它,因为表达式是属性引用,因此this
值为john
(而不是全局对象) ,就像你通过属性引用调用而不是一样。)
如果您正在阅读规范,我建议您阅读newest one而不是旧版本(还没有HTML版本)。不过,我担心散文不会少。 : - )