我看到了这个快捷方式作为代码Kata的答案,但我很难理解下面的例子在做什么。什么是fn.bind.apply(fn,arguments)在做什么?
function func(fn) {
return fn.bind.apply(fn, arguments);
}
到目前为止,我的理解是,绑定创建一个新的功能,类似于执行以下操作:
是这种情况?任何更清楚的答案或故障将会很好。
我看到了这个快捷方式作为代码Kata的答案,但我很难理解下面的例子在做什么。什么是fn.bind.apply(fn,arguments)在做什么?
function func(fn) {
return fn.bind.apply(fn, arguments);
}
到目前为止,我的理解是,绑定创建一个新的功能,类似于执行以下操作:
是这种情况?任何更清楚的答案或故障将会很好。
fn.bind
只是
Function.prototype.bind
fn.bind(arguments[0]/* doesn't matter, it's fn*/, arguments[1], arguments[2], etc.)
因此绑定函数被调用,参数是的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
看到https://developer.mozilla.org/en/docs/Web/ JavaScript/Reference/Global_objects/Function/bind – mb21