无法映射绑定数组

时间:2016-05-19 15:43:02

标签: javascript

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

2 个答案:

答案 0 :(得分:0)

要解决JS流行测验,您可以这样做:

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

但是,我意识到这不是你要问的问题:)。

我的方法中有一些我不理解的东西:

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

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

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

长话短说,你让你的价值观混乱,你的价格过于复杂。

答案 1 :(得分:0)

来自文档mdn docs for map

  

thisArg可选。执行回调时要使用的值。   默认值是Window对象

如前所述,您可以映射:

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

如果你打电话:

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

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