fn.bind.apply(fn, arguments) 在做什么?
What is fn.bind.apply(fn, arguments) doing?
我看到这个快捷方式作为代码 Kata 的答案给出,但我很难理解下面的示例在做什么。
function func(fn) {
return fn.bind.apply(fn, arguments);
}
到目前为止,我的理解是 bind 创建了一个类似于执行以下操作的新函数:
function func(fn) {
return function () {
return fn.apply(fn, arguments);
};
}
是这样吗?任何更清晰的答案或正在发生的事情的细分都会很棒。
fn.bind
只是
Function.prototype.bind
fn.bind(arguments[0]/* doesn't matter, it's fn*/, arguments[1], arguments[2], etc.)
所以调用绑定函数的参数是 fn
之后的 func
的参数。
另一种写法是:
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
我看到这个快捷方式作为代码 Kata 的答案给出,但我很难理解下面的示例在做什么。
function func(fn) {
return fn.bind.apply(fn, arguments);
}
到目前为止,我的理解是 bind 创建了一个类似于执行以下操作的新函数:
function func(fn) {
return function () {
return fn.apply(fn, arguments);
};
}
是这样吗?任何更清晰的答案或正在发生的事情的细分都会很棒。
fn.bind
只是
Function.prototype.bind
fn.bind(arguments[0]/* doesn't matter, it's fn*/, arguments[1], arguments[2], etc.)
所以调用绑定函数的参数是 fn
之后的 func
的参数。
另一种写法是:
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