【问题标题】:Cannot map bind over array无法在数组上映射绑定
【发布时间】:2016-05-19 15:43:01
【问题描述】:

当我收到一条我不明白的错误消息时,我正试图解决 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))

【问题讨论】:

  • @Tushar 很有趣,但如果原因是 map 传递了两个参数,我不明白为什么 fns.map((x, y) => Function.prototype.call.bind(x, y)) 会起作用
  • bind 未绑定到 call。你想改用fns.map(Function.prototype.bind, Function.prototype.call)(或者fns.map(Function.prototype.bind.bind(Function.prototype.call)),如果你愿意的话)

标签: javascript


【解决方案1】:

要解决 JS pop 测验,你可以这样做:

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

但是,我知道这不是你要问的:)。

在你的方法中有一些我不明白的地方:

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

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

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

长话短说,你把你的价值观都搞混了,而且你把事情复杂化了。

【讨论】:

    【解决方案2】:

    来自文档mdn docs for map

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

    如前所述,可以映射:

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

    如果你打电话:

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

    绑定应用在对象上不起作用!并引发错误,因为对象没有绑定方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      相关资源
      最近更新 更多