【发布时间】:2023-01-26 16:40:44
【问题描述】:
我正在实现一个 JavaScript 解释器,但我无法弄清楚将函数绑定到 JavaScript 中的对象的细节。
一个基本的例子:
const o = {
x: 1,
getX: function() {
return this.x;
}
};
o.getX(); // returns 1
棘手的部分是当您将 getX 分配给变量时会发生什么:
let gX = o.getX;
gX(); // returns undefined
我的问题是:运行时如何知道 o.getX() 绑定到 o,但 gX() 应该解除绑定?我假设 gX 和 o.getX 指向完全相同的函数!
我首先想到可能 . 的存在是造成差异的原因。因此,在语法中,有一个类似于 <method-call> ::= <expr> '.' ID '(' <expr>* ')' 的产生式,这个表达式的处理方式与“常规”调用(没有.)。
但是下面的表达式似乎反驳了这个理论,因为(o.getX)()也返回了1。然而,以某种神奇的方式,(gX = o.getX)() 返回undefined,尽管我很清楚赋值表达式返回其右侧的大小,所以在这种情况下为o.getX!
是否有关于如何实现这些语义的简单解释?我想不出我的运行时应该区分 o.getX 绑定到 o 的方法,但是 gX,即使它指向 o.getX,也没有绑定。
【问题讨论】:
-
当谈论用
function关键字定义的函数时,一个简单的规则是,this是总是绑定时函数是称为,无一例外(有时它有点隐藏在实际调用函数的地方)。有关详细信息,请参阅the standard。
标签: javascript javascript-objects programming-languages interpreter instance-methods