Javascript 为什么bind.apply(fn,arguments)在传递arguments对象时忽略第一个参数?
当我将bind.apply()作为第二个参数传递arguments对象时,我遇到了一个意外的js行为,它似乎在执行函数时忽略了第一个参数Javascript 为什么bind.apply(fn,arguments)在传递arguments对象时忽略第一个参数?,javascript,Javascript,当我将bind.apply()作为第二个参数传递arguments对象时,我遇到了一个意外的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 //
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)
问题是接受一个或多个参数
(此arg[,arg1[,arg2[,…])
当您使用参数(fn[fn,4,4])
时,您正在做两件事
函数.prototype.bind
此
上下文绑定到fn
,以及bind(fn,4,4)
bind(fn,4,4)
将创建一个新函数,该函数为其这个上下文绑定到fn
,并带有默认参数(4,4)
如果您真的希望fn
作为自身的第一个参数出现(对我来说这听起来是个坏主意),我发现spread操作符更容易理解
函数func(fn,…args){
返回fn.bind(fn,fn,…args)
// ^ ^ ^
// | | |
//| | args#2,#3。。。
//| arg#1
//这个
}
因此,您正在使用apply
将fn
设置为this
用于bind
。很不清楚你想做什么。你希望a
、b
和c
在add
中是什么?我希望它们的值与funcAh中的值相同,我明白你现在的意思了。因为arguments
包含fn
,所以这应该是传递给bind
的参数的一部分。Interesting@rafi取决于您是否希望函数使用此
。如果要使用bind
提供默认参数,则需要提供thisArg