偏函数
维基百科中对偏函数(Partial)的定义为:
In computer science, partial application(or partial function application) refers to the process of fixing a number of arguments to a function, producing another function of smaller arity.
在计算机科学中,局部应用是指固定一个函数的一些参数,然后产生另一个更小元的函数。
什么是元?
元是指函数参数的个数,比如一个带有两个参数的函数被称为二元函数。
🌰 示例:
function add(a, b) {
return a + b;
}
// 执行 add 函数,一次传入两个参数即可
add(1, 2); // 3
// 假设有一个 partial 函数可以做到局部应用
var addOne = partial(add, 1);
addOne(2); // 3
偏函数与柯里化十分相像:
- **柯里化:**将多参数函数转换成多个单参数函数,也就是将一个 n 元函数转换成 n 个一元函数
- **偏函数:**则是固定一个函数的一个或多个参数,也就是将一个 n 元函数转换成一个 n - x 元函数
实际应用
bind
函数可以让我们传入一个或多个预设的参数,之后返回一个新函数,并拥有指定的 this
值和预设参数。当绑定函数被调用时,这些参数会被插入到目标函数的参数列表的开始位置,传递给绑定函数的参数跟在它们后面。
function addition(x, y) {
return x + y;
}
const plus5 = addition.bind(null, 5);
plus5(10);
// 15
plus5(25);
// 30
我们预先传入参数 5
,并返回一个新函数赋值给 plus5
,此函数可以接受剩余的参数。调用 plus5
传入剩余参数 10
得到最终结果 15
,又传入参数 20
得到结果 30
。偏函数通过设定预设值,帮助哦我们实现代码上的复用。
实现偏函数
在 Underscore.js 和 Lodash 均有实现 partial
偏函数,这里稍微实现一下:
var _ = {};
function partial(fn) {
var args = [].slice.call(arguments, 1);
return function() {
var position = 0,
leng = args.length;
for (var i = 0; i < len; i++) {
args[i] = args[i] === _ ? arguments[position++] : args[i];
}
while (position < arguments.length) args.push(arguments[position++]);
return fn.apply(this, args);
};
}
参考资料: