对象成员函数的javascript函数调用表达式
我试图理解对象成员函数绑定到对象实例的时间点。在下面的示例中对象成员函数的javascript函数调用表达式,javascript,Javascript,我试图理解对象成员函数绑定到对象实例的时间点。在下面的示例中 函数F(){ this.foo='foo'; }; var f=新的f(); f、 测试=函数(){ 警报(this.foo); }; var c=f检验; f、 test(); (f.测试)(); 变量d; (d=f.test)(); c()括号充当语法分组机制,但它们在表达式的语义解释/评估中没有任何作用。因此,在带括号的表达式中,括号内的任何内容都保存在从子表达式检索值之前的点上。这意味着属性引用子表达式将保持正确的状态,以便
函数F(){
this.foo='foo';
};
var f=新的f();
f、 测试=函数(){
警报(this.foo);
};
var c=f检验;
f、 test();
(f.测试)();
变量d;
(d=f.test)();
c()代码>括号充当语法分组机制,但它们在表达式的语义解释/评估中没有任何作用。因此,在带括号的表达式中,括号内的任何内容都保存在从子表达式检索值之前的点上。这意味着属性引用子表达式将保持正确的状态,以便在最终提取值时,操作会像括号根本不存在一样进行
编辑-正如RobG在几条评论中指出的那样,关键在于语言定义定义表达式求值过程的方式。该规范区分了计算到可能获得与运算符一起使用的实际值时所涉及的步骤,以及实际获得值的步骤。在这些术语中,()
标记实际上不是运算符,而类似于
、[]
和=
的标记则是运算符。因此,为了执行操作符的行为,必须执行GetValue
概念操作。此时,如果值的来源是
或[]
的结果,则该事实是已知的,并且“方法调用”将发生此
行为。但是,该值本身没有任何关于其来源的“记忆”。如果该值用于执行类似于=
(赋值)的行为或用作函数调用参数,则该值的未来操作将不会“记住”该值是从对象属性引用获得的
我承认这有点奇怪。括号起到了语法分组机制的作用,但它们在表达式的语义解释/评估中没有任何作用。因此,在带括号的表达式中,括号内的任何内容都保存在从子表达式检索值之前的点上。这意味着属性引用子表达式将保持正确的状态,以便在最终提取值时,操作会像括号根本不存在一样进行
编辑-正如RobG在几条评论中指出的那样,关键在于语言定义定义表达式求值过程的方式。该规范区分了计算到可能获得与运算符一起使用的实际值时所涉及的步骤,以及实际获得值的步骤。在这些术语中,()
标记实际上不是运算符,而类似于
、[]
和=
的标记则是运算符。因此,为了执行操作符的行为,必须执行GetValue
概念操作。此时,如果值的来源是
或[]
的结果,则该事实是已知的,并且“方法调用”将发生此
行为。但是,该值本身没有任何关于其来源的“记忆”。如果该值用于执行类似于=
(赋值)的行为或用作函数调用参数,则该值的未来操作将不会“记住”该值是从对象属性引用获得的
我坦率地承认,这有点奇怪。这真的是MemberExpression和CallExpression——为什么你认为不是这样?而且,你的问题真的不是很清楚;你说你得到的结果是预期的。“我们如何阅读”代码的问题并不清楚。这是什么意思?它与我们读取它的方式有什么区别?因为MemberExpression的结果根据表达式之外的内容不同计算表达式时不调用GetValue,因此它有效地返回表达式并维护基本对象,所以这可以在调用中设置。它实际上是MemberExpression和CallExpression-为什么你认为它不是这样?而且,你的问题真的不是很清楚;你说你得到的结果是预期的。“我们如何阅读”代码的问题并不清楚。这是什么意思?因为MemberExpression的结果根据表达式之外的内容而不同,所以在计算表达式时不调用GetValue,所以它有效地返回表达式并维护基本对象,所以可以在调用中设置。这对我来说绝对是一个令人惊讶的行为。我一直认为表达式返回一个值/引用,而parens只是将某些内容强制放入表达式上下文中。我原以为它会将这个
绑定到全局对象并返回未定义的
。在spec for中,您可以看到MemberExpression是通过第一次调用来计算的,这反过来又解析了基本对象。函数不调用GetValue,而是返回表达式。在赋值中,调用GetValue,只返回引用,因此基本对象丢失。因此,丢失基本对象后,根据严格模式与否,默认为全局/未定义。因此我的理解是,c=f.foo
的rhs部分与CallExpression(f.foo)
的参数是相同的引用,但是该引用本身知道f
对象-请参见中的IsPropertyReference.@AndreySidorov属性值是对一个对象的引用,该值本身不知道哪些属性持有它,因此一旦传递到另一个变量或属性,就不会引用它的来源。会的