2015-06-10 98 views
2

我看到了这个快捷方式作为代码Kata的答案,但我很难理解下面的例子在做什么。什么是fn.bind.apply(fn,arguments)在做什么?

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

到目前为止,我的理解是,绑定创建一个新的功能,类似于执行以下操作:

​​

是这种情况?任何更清楚的答案或故障将会很好。

+0

看到https://developer.mozilla.org/en/docs/Web/ JavaScript/Reference/Global_objects/Function/bind – mb21

回答

4
fn.bind 

只是

Function.prototype.bind 

因此,我们applyingbindfn,返回

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 
+0

在'另一种写作方式'之前帮助了我。之后是额外的信用。感谢您的解释:) – AmmarCSE

+1

谢谢,不幸的是,我不能upvote,但你提供了我所希望的澄清。 –

+0

所以原始代码示例中'func'的主体可以写成'return Function.prototype.bind.apply(fn,arguments);'并且仍然工作完全一样?而它最初写的方式,最初的'fn'基本上没有意义? – NateQ