x={f(){return this}}
x.f() //x
(x.f)() //x
(0,x.f)() //window
我了解到括号(分组运算符)不会将 GetValue 应用于其中的表达式,而其他运算符,例如 , 和 ||做。这是否意味着
(x.f)
和 (0,x.f)
实际上是内存中的两个不同的对象,因此它们的 this
也绑定到不同的对象。但是,我尝试了以下方法来比较两个函数本身(而不是它们返回的值),它们都显示相同。这些方法无法真正比较它们的内存地址,所以我不知道它们是否是同一个对象。
(x.f)==(0,x.f) //true
(x.f)===(0,x.f) //true
Object.is((x.f),(0,x.f)) //true
这是否意味着
和(x.f)
实际上是内存中的两个不同的对象,因此它们的(0,x.f)
也绑定到不同的对象。this
不,根本不是这个意思。
在下面的代码片段中,
x.f
和y.f
是同一个函数对象,但x.f()
和y.f()
返回不同的结果。
const x = {
value: 3,
f: function f() {
return this.value;
}
};
const y = { value: 4 };
y.f = x.f;
console.log(x.f()); // logs '3'
console.log(y.f()); // logs '4'
怎么会这样?
嗯,这是因为
this
实际上并不是函数本身的特征;相反,当调用函数时,它会被传递到函数中,就像传入参数一样。就像 function f(arg) { return arg; }
当被称为 7
时返回 f(7)
,而当被称为 8
时返回
f(8)
,所以
function f() { return this; }
当被称为 x
时返回 x.f()
,但当被称为 y
时返回 y.f()
。这是 JavaScript 中方法如何工作的一个重要方面;这就是实现继承的原因。例如, [1, 2, 3].slice(2)
和
[4, 5, 6].slice(2)
都调用相同的 slice
函数,该函数是在它们都继承的原型实例上定义的,但它能够为调用它的任何数组返回正确的信息。那么,回到你的例子。 。 。 x.f
和
(x.f)
和 (0, x.f)
都计算为相同的函数,但是 x.f()
和 (x.f)()
都表示调用该函数并将 x
作为 this
参数传递,而 (0, x.f)()
则执行 不是说将
x
作为 this
参数传递(因此默认将全局对象
window
作为
this
参数传递)。