JavaScript:(0, x.f) 和 (x.f) 真的不同吗

问题描述 投票:0回答:1
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
javascript object this comma-operator
1个回答
1
投票

这是否意味着

(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
 参数传递)。

© www.soinside.com 2019 - 2024. All rights reserved.