JS:如果你调用这个函数,结果是 3,但是如果你用 f.call(f) 绑定上下文 - 结果是 5

JS: If you call the function, the result is 3, but if you bind the context with f.call(f) - the result is 5

var f = function() {
  this.x = 5;
  (function() {
    this.x = 3;
  })();
  console.log(this.x);
};

var obj = {
  x: 4,
  m: function() {
    console.log(this.x);
  }
};

f(); // 3
new f(); // 5
f.call(f); // 5
obj.m.call(f); // 5

如果调用该函数,结果为 3,但如果将上下文与 f.call(f) 绑定 - 结果为 5。此外,如果我将函数作为构造函数调用。为什么会这样?很抱歉这个愚蠢的问题,但我试图找到答案,但找不到。

  • 在第一种情况下,您调用 f() 作为一个简单的命名函数。所以它里面的this关键字指的是全局作用域(window)。

    结果:函数体内的this和函数体内闭包内的this指向同一个对象:window.

  • 在第二种情况下,您将 f() 作为构造函数调用,因此 this 关键字将指向创建的对象。但是闭包,因为它是匿名的,将继续引用 this 的全局范围,所以在这种情况下,它们不会指向同一事物,并且构造函数 f() 创建的对象不会发生变化通过关闭。

  • 在第三种情况下,您像第一次一样调用 f,但将 this 的值指定为函数 f 本身。所以这里this的行为相当于第二种情况

  • 在第 4 种情况下,您使用 f 的上下文调用 m,因此 this.x 将引用 f for thisf 里面的闭包一直引用 window.