gpt4 book ai didi

对象成员函数的javascript函数调用表达式

转载 作者:行者123 更新时间:2023-11-28 06:55:09 25 4
gpt4 key购买 nike

我试图了解对象成员函数何时绑定(bind)到对象实例。在下面的例子中

function F() {
this.foo = 'foo';
};

var f = new F();
f.test = function() {
alert(this.foo);
};

var c = f.test;


f.test();
(f.test)();
var d;
(d = f.test)();
c();

输出为"foo""foo"undefinedundefined(如预期)。如果我们查看最后 4 行 AST,它看起来像 this ,对于直接调用和赋值 + 调用来说是相同的 MemberExpression 参数

{
"type": "MemberExpression",
"computed": false,
"object": {
"type": "Identifier",
"name": "f"
},
"property": {
"type": "Identifier",
"name": "test"
}
}

所以问题是:为什么我们不能将 (f.test)() 理解为两个不同的操作 - MemberExpression + CallExpression,相反,它看起来更像是语言“MemberCallEcpression”中的特殊情况“(以及为什么 AST 解析器没有将其作为特殊情况)?为什么f.foo表达式的结果在函数调用时是绑定(bind)函数,而在赋值时是未绑定(bind)的?

最佳答案

括号充当语法分组机制,但它们在表达式的语义解释/评估中不起任何作用。因此,在带括号的表达式中,括号内的内容都保存在从子表达式检索值之前的点。这意味着属性引用子表达式保持正确的状态,这样当最终提取值时,操作就会发生,就好像括号根本不存在一样。

编辑 - 正如 RobG 在几条评论中指出的那样,关键在于语言定义定义表达式求值过程的方式。该规范区分了评估可能获得与运算符一起使用的实际值所涉及的步骤和实际获取该值的步骤。在这些术语中,( ) 标记实际上并不是运算符,而类似 .[ ]= 是。因此,为了执行运算符(operator)的行为,必须完成 GetValue 概念操作。此时,如果值的来源是 .[] 的结果,则该事实是已知的,并且“方法调用”this 行为将会发生。然而,该值本身没有任何关于它来自何处的“内存”。如果该值用于执行诸如 = (赋值)之类的行为或用作函数调用参数,则对该值的 future 操作将不会“记住”该值已获得来自对象属性引用。

我承认这有点奇怪。

关于对象成员函数的javascript函数调用表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32622383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com