无法通过数组映射绑定

Cannot map bind over array

本文关键字:映射 绑定 数组      更新时间:2023-09-26

我试图解决https://twitter.com/secoif/status/730207047892017153当我收到错误信息时,我不明白。我在运行此代码时出错

const fns = [
  function () {
    console.log(1)
  },
  function () {
    console.log(2)
  },
  function () {
    console.log(3)
  }
]
fns.map(Function.prototype.call.bind)

Chrome浏览器告诉我"绑定必须在函数上调用",我不理解。下面的行应该是等效的,但没有抛出相同的错误。

fns.map((x) => Function.prototype.call.bind(x))

要解决JS弹出测试,您可以这样做:

for (var x in fns) fns[x]();

然而,我意识到这不是你要问的:)。

在你的方法中有几件事我不理解:

1) 为什么要使用.map()?Map用于返回另一个数组,这是不需要的,所以为什么不使用forEach()呢?

2) 我不知道你为什么要用bind。使用map()时,回调将传递3个参数:当前函数、数组中函数的索引以及数组本身。当你查看bind()的语法时,你会注意到bind的第一个参数是"this"对象,后面是要在绑定到的函数中传递的参数。在这种情况下,"this"将被设置为当前函数,索引和数组将作为参数传递给函数。

3) 调用时使用绑定。call()将采用与bind()相同的参数,其中第一个参数是"this",其余参数将传递到被调用的函数中。当您使用.bind()时,它会将"this"对象设置为函数,第一个参数将是索引。因此,从.call()的角度来看,您将其设置为函数的"this",并将索引作为第一个参数传递给call(),这就是call的"this",然后将整个数组作为第一个变量传递给函数。

长话短说,你把自己的价值观搞混了,把这件事搞得过于复杂。

来自映射的文档mdn文档

thisArg可选。执行回调时用作此的值。默认值为Window对象

如前所述,您可以映射:

fns.map(Function.prototype.call.bind, Function.prototype.call.bind)

如果您拨打:

fns.map(Function.prototype.call.bind)

绑定应用于对象而不是函数!并引发错误,因为对象没有绑定方法。