Javascript 使用arrow函数作为方法会意外产生以下结果:MDN';s带有[].push.call()的示例

Javascript 使用arrow函数作为方法会意外产生以下结果:MDN';s带有[].push.call()的示例,javascript,arrays,function,Javascript,Arrays,Function,无法使用基于箭头函数的方法复制(«以类似数组的方式使用对象») > let obj = { ... length: 0, ... addEl: el => [].push.call(this, el={}) //default argument ... }; 这很重要,但是…什么?它肯定会将递增的值存储在某个地方,但存储在哪里 > obj.addEl(); 1 > obj.addEl({}); 2 > obj { length: 0, addEl: [Functi

无法使用基于箭头函数的方法复制(«以类似数组的方式使用对象»)

> let obj = {
... length: 0,
... addEl: el => [].push.call(this, el={}) //default argument
... };
这很重要,但是…什么?它肯定会将递增的值存储在某个地方,但存储在哪里

> obj.addEl();
1
> obj.addEl({});
2
> obj
{ length: 0, addEl: [Function: addEl] } // array function «this» problem?
原始变量以正确的方式增加长度,但也会创建新特性。在这个例子中没有关于它的任何内容

addEl: function (el) { [].push.call(this, el) }
...
// the function in work
> anotherObj.addEl();
> anotherObj.addEl('new');
> anotherObj
{ '0': undefined,
  '1': 'new',
  length: 2,
  addEl: [Function: addEl] }

可以吗?如果是这样,我想,它应该被称为“创建类似数组的对象”,这不仅意味着长度属性,还意味着数字键。相关的,已经回答过的问题是。

这是因为您使用的是箭头函数,它不绑定此函数,使用普通函数将得到结果

addEl: el => [].push.call(this, el={})

在您的示例中指的是全局窗口对象

这是因为您使用的是不绑定此对象的箭头函数,使用普通函数将得到结果

addEl: el => [].push.call(this, el={})

在您的示例中,指的是全局窗口对象

递增值存储在
窗口
中,因为箭头函数不绑定
。它们的
值是封闭范围的值,在本例中为全局范围。例如:

let obj = {
  length: 0,
  addEl: el => [].push.call(this, el={}) //default argument
};

console.log(obj.addEl());
console.log(window.length);
窗口的长度为递增值。之所以
obj.addEl()
返回递增值,是因为
Array#push
返回新的
长度。如果您记录
window[0]
,您将获得推送到
this
的默认参数,即
window

> window[0]
< {}
>窗口[0]
< {}

正则函数表达式行为不同的原因是它们绑定到对象
obj
,因此
在正则函数表达式中指的是
obj
,而不是在箭头函数中指的是
window

递增值存储在
窗口中,因为箭头函数不绑定
。它们的
值是封闭范围的值,在本例中为全局范围。例如:

let obj = {
  length: 0,
  addEl: el => [].push.call(this, el={}) //default argument
};

console.log(obj.addEl());
console.log(window.length);
窗口的长度为递增值。之所以
obj.addEl()
返回递增值,是因为
Array#push
返回新的
长度。如果您记录
window[0]
,您将获得推送到
this
的默认参数,即
window

> window[0]
< {}
>窗口[0]
< {}

正则函数表达式行为不同的原因是它们绑定到对象
obj
,因此
在正则函数表达式中指的是
obj
,而不是在箭头函数中指的是
window

您的arrow函数已按字典顺序绑定
。是的,使用对象自己的
。预期结果是长度
和索引属性。您的arrow函数已按字典顺序绑定
。是,使用对象自己的
.length
和索引属性是预期结果。请解释downvoteI没有这样做。然而,我怀疑这个问题与
这个
上下文有关,而箭头函数没有这个问题。但我仍然不知道为什么它不与对象本身绑定。这个函数算什么?该值在哪里?它正在增加windows.length,因为它调用以增加该值,当前为windows。如果您使用console.log(windows.length),您将看到解释downvoteI没有这样做的值。然而,我怀疑这个问题与
这个
上下文有关,而箭头函数没有这个问题。但我仍然不知道为什么它不与对象本身绑定。这个函数算什么?该值在哪里?它正在增加windows.length,因为它调用以增加该值,当前为windows。如果您使用console.log(windows.length),您将看到我期望得到的这个答案的值(请参阅我在此处的其他注释,以获得@marvel308的答案)。但为什么原始示例中的函数会向对象添加新属性?“这是正确的吗?为什么?”朱利明在我回答的最下面解释了这一点。是的,这是正确的行为,因为当您使用正则函数表达式时,
显式绑定到调用对象。因此,当您执行
obj.addEl()
时,
obj
是正则函数表达式中的
this
值。因此,在
obj
中添加了一个新的数值属性,并且长度增加了。因此,我不应该使用箭头函数作为方法,对吗?@JulyMorning您不应该这样做。术语“方法”特别适用于正则函数表达式,因为正则函数表达式实际上绑定了
,因此绑定到对象,这是方法的定义。(除了ES2017/18 ish中的类属性箭头函数之外)。我期待着这个答案(请参阅我在这里的其他评论,以获得@marvel308的答案)。但为什么原始示例中的函数会向对象添加新属性?“这是正确的吗?为什么?”朱利明在我回答的最下面解释了这一点。是的,这是正确的行为,因为当您使用正则函数表达式时,
显式绑定到调用对象。因此,当您执行
obj.addEl()
时,
obj
是正则函数表达式中的
this
值。因此,在
obj
中添加了一个新的数值属性,并且长度增加了。因此,我不应该使用箭头函数作为方法,对吗?@JulyMorning您不应该这样做。术语“方法”特别适用于正则函数表达式,因为正则函数表达式实际上绑定了
,因此绑定到对象,这是方法的定义。(ES2017/18 ish中的类属性箭头函数除外)。