Javascript 为什么bind.apply(fn,arguments)在传递arguments对象时忽略第一个参数?

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 //

当我将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 // 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