当我将arguments对象作为第二个参数传递给bind.apply()时,遇到了意外的js行为,似乎它在执行函数时忽略了第一个参数。
function func(fn){
console.log(arguments) // [ƒ, 4, 4]
return fn.bind.apply(fn, arguments)
}
function add(a,b,c){
console.log(arguments) // [4, 4]
return b + c // c is undefined
}
let foo = func(add,4, 4)
foo() // NaN (expected 8)
答案 0 :(得分:1)
问题是Function.prototype.bind()
接受一个或多个参数
(thisArg[, arg1[, arg2[, ...]]])
将Function.prototype.apply()
与参数(fn, [fn, 4, 4])
一起使用时,您正在做两件事...
Function.prototype.bind
this
上下文绑定到fn
,并且bind(fn, 4, 4)
您现在看到问题了吗? bind(fn, 4, 4)
将创建一个新函数,并为其fn
上下文绑定到this
,并使用默认参数(4, 4)
。
如果您真的希望fn
成为其自身的第一个参数(这对我来说似乎是个坏主意),那么我发现散布运算符更容易理解
function func(fn, ...args) {
return fn.bind(fn, fn, ...args)
// ^ ^ ^
// | | |
// | | args #2, #3, ...
// | arg #1
// this
}