方法Set.prototype.add调用不兼容的接收器undefined

Was*_*des 10 javascript

我根本无法理解为什么它会给出这个错误.

这是我在chrome控制台上测试的内容:

>    var mySet;
<-   undefined

>    mySet = new Set;
<-   Set {}

>    mySet.add('foo', 'bar', 'baz')       // Worked as expected
<-   Set {"foo"}                          // just the first argument was added

>    ['bar', 'baz'].forEach(mySet.add)
X->  VM1529:1 Uncaught TypeError: 
         Method Set.prototype.add called on incompatible receiver undefined(…)
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Yur*_*kym 13

在这种情况下,当您将其作为回调传递时,add方法会丢失其内部this上下文,因此您需要使用bind:

['bar', 'baz'].forEach(mySet.add.bind(mySet));
Run Code Online (Sandbox Code Playgroud)

  • `forEach` 和 `map` 的第二个参数是 `thisArg`:一个绑定 this 的参数,所以你可以把它缩短为:`.map(mySet.add, mySet)`(`map` 不是真正的任何比`.forEach`慢)。 (8认同)
  • @dandavis:鉴于我们使用`Set`,我们当然也可以使用箭头功能:-) (2认同)