当我收到一条我不明白的错误信息时,我试图解决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))
答案 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)
thisArg可选。执行回调时要使用的值。 默认值是Window对象
如前所述,您可以映射:
fns.map(Function.prototype.call.bind, Function.prototype.call.bind)
如果你打电话:
fns.map(Function.prototype.call.bind)
绑定应用于对象不起作用!并引发错误,因为对象没有绑定方法。