什么是fn.bind.apply(fn,arguments)呢?

时间:2015-06-10 11:24:55

标签: javascript arguments

我看到这个快捷方式作为代码Kata的答案,但我很难理解下面的例子正在做什么。

function func(fn) {
  return fn.bind.apply(fn, arguments);
}

到目前为止,我的理解是bind创建了一个类似于执行以下操作的新函数:

function func(fn) {
  return function () {
    return fn.apply(fn, arguments);
  };
}

是这样的吗?任何更明确的答案或故障都会很好。

1 个答案:

答案 0 :(得分:4)

fn.bind

只是

Function.prototype.bind

所以我们重新applying bindfn,返回

fn.bind(arguments[0]/* doesn't matter, it's fn*/, arguments[1], arguments[2], etc.)

因此调用bound函数时参数是func之后fn的参数。

写它的另一种方法是:

function func(fn) {
  var args = [].slice.call(arguments, 1);
  return function () {
    var localArgs = [].slice.call(arguments);
    return fn.apply(fn, args.concat(localArgs)); 
  };
}

调用的上下文是初始函数(arguments[0])的事实当然只是副作用。重要的是我们用函数包装参数,但是可以动态地传递其他参数。

示例1,包装所有参数:

function add(a,b){
  return a+b
}
var f = func(add, 2 ,3); // f is a function which will always apply add to 2 and 3 
console.log(f()) // logs 5

例2,currying

function multiply(a,b){
  return a*b
}
var multBy2  = func(multiply, 2);
console.log(multBy2(3)) // logs 6