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

时间:2019-04-04 23:22:43

标签: javascript

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

1 个答案:

答案 0 :(得分:1)

问题是Function.prototype.bind()接受一个或多个参数

(thisArg[, arg1[, arg2[, ...]]])

Function.prototype.apply()与参数(fn, [fn, 4, 4])一起使用时,您正在做两件事...

  1. Function.prototype.bind this上下文绑定到fn,并且
  2. 呼叫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
}