为什么圆括号内的运算符在函数调用中更改为`this`

2022-03-16 00:00:00 javascript this comma-operator

谈话很便宜;请给我看代码。

// equals to this.test = "inside window"
var test = "inside window";

function f () {
  console.log(this.test)
};

var obj = {
  test: "inside object",
  fn: f
};

obj.fn();      // "inside object"   --> fine
(obj).fn();    // "inside object"   --> fine
(1, obj).fn(); // "inside object"   --> fine
(obj.fn)();    // "inside object"   --> fine
(0 || obj.fn)(); // "inside window"   --> why?

// reference equality check
console.log(
  f === obj.fn && 
  (obj.fn) === f && 
  f === (1, obj.fn)
); // all equal :/

我读过ydkjs一书,我熟悉调用点和动态绑定,但我不明白为什么最后一个函数调用将上下文作为其上下文;在这个对照实验中,唯一 这被更改为()comma operator,正如您在最后一条语句中看到的那样,comma operator做了一些奇怪的事情。我怀疑它在返回值时执行赋值(因为如果我们执行赋值也会产生相同的结果),但我不确定。

更新:

&&||运算符:(0 || obj.fn)()


解决方案

给定:

foo.bar()

内部barthis将为foo

(有例外,例如bar是用箭头函数定义的,但在这种情况下不适用)。

给定:

const bar = foo.bar;
bar();

现在已在没有foo上下文的情况下调用了函数,因此this现在是默认对象(在浏览器中为window)。

表达式:(1, foo.bar)计算为右侧。这就是函数。

就像您已将其复制到变量一样,这会在您调用函数之前断开它与对象的连接,因此您将获得相同的效果。

没有赋值,因为您没有涉及变量,但您调用的是表达式的结果,而不是直接调用对象方法。

相关文章