##偏应用函数
“分布应用”一个函数是一项特别有趣的技术,在函数调用之前我们可以预先传入一些函数。实际上,偏应用函数返回了一个含有预处理参数的新函数,以便后期可以调用。
这种在一个函数中首先填充几个参数(然后在返回一个新函数)的技术称为柯里化。
🌰 我们希望将一个字符串分隔成CSV(逗号分隔),并忽略多余的空格,我们可以很容易的通过一个正则表达式,使用String的split()方法做到这一点。
var elements = "val1,val2,val3".split(/,\s*/);
现在让我们编写一个CSV( )方法做这件事并假设使用柯里化。
String.prototype.csv = String.prototype.split.partial(/,\s*/);
var result = ("Mugan,Jin,Fuu").csv();
Prototype库中的分部/柯里化方法的实现如下:
Function.prototype.curry = function(){
var fn = this,
args = Array.prototype.slice.call(arguments);
return function(){
return fn.apply(this,args.concat(
Array.prototype.slice.call(arguments)));
};
};
一个分部函数事例:
Function.prototype.partial = function(){
var fn = this,args = Array.prototype.slice.call(arguments);
return function(){
var arg = 0;
for(var i=0;i<args.length && args<arguments.length;i++){
if(args[i]==undefined){
args[i]=arguments[arg++];
}
}
return fn.apply(this,args);
}
};
实现一个10ms后进行调用的异步函数
var delay = setTimeout.partial(undefined,10);
delay(function(){
.... ....
});
当然我们也可以创建一个简单的函数用于事件绑定
var bindClick = document.body.addEventListener.partial("click",undefined,false);
bindClick(function(){
... ...
});