定义
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
特点
1.参数复用
function uri_curry(protocol) {
return function(hostname, pathname) {
return `${protocol}${hostname}${pathname}`
}
}
const uri_base = uri_curry('https://')
const uri_baidu = uri_base('www.baidu.com', '/search')
const uri_ali = uri_base('www.ali.com', '/taobao')
const uri_tencent = uri_base('www.tencent.com', '/qq')
console.log(uri_baidu);// https://www.baidu.com/search
console.log(uri_ali);// https://www.ali.com/taobao
console.log(uri_tencent);// www.tencent.com/qq
2.提前返回
提前返回指的是,提前对一些判断进行返回,有的判断在一次判断后,就不需再判断了,比如下面这个红宝书中的创建XMLHTTPRequest对象的方法
function createXMLHTTPRequest() {
var xmlHttpRequest;
if (window.XMLHttpRequest) {
xmlHttpRequest = new XMLHttpRequest();
if (xmlHttpRequest.overrideMimeType) {
xmlHttpRequest.overrideMimeType("text/xml");
}
} else if (window.ActiveXObject) {
var activexName = [ "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ];
for ( var i = 0; i < activexName.length; i++) {
try {
xmlHttpRequest = new ActiveXObject(activexName[i]);
if(xmlHttpRequest){
break;
}
} catch (e) {
}
}
}
return xmlHttpRequest;
}
使用这个方法,每次都要对其进行一次判断,将其改为:
function createXMLHTTPRequestCurry() {
var xmlHttpRequest;
if (window.XMLHttpRequest) {
return function(){
xmlHttpRequest = new XMLHttpRequest();
if (xmlHttpRequest.overrideMimeType) {
xmlHttpRequest.overrideMimeType("text/xml");
}
return xmlHttpRequest
}
} else if (window.ActiveXObject) {
return function(){
var activexName = [ "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ];
for ( var i = 0; i < activexName.length; i++) {
try {
xmlHttpRequest = new ActiveXObject(activexName[i]);
if(xmlHttpRequest){
break;
}
} catch (e) {
}
}
return xmlHttpRequest;
}
}
return function(){
return;
}
}
这样除了第一次的判断外,后面都不再判断,直接执行判断后的内容。
3.延迟执行
function add(...args) {
// var _args = Array.prototype.slice.call(arguments)
const _args = args
const _adder = function(...args2) {
// _args.push(...arguments)
_args.push(...args2)
return _adder
}
_adder.toString = function() {
return _args.reduce(function(a, b) {
return a + b
}, 0)
}
return _adder
}
// 传不定参数
// 随时累加
let a = add(1, 2, 3)
let b = add(1)(2)(3)
console.log(a == 6);
延迟执行实际上就是当我们调用这个方法时,不会立即执行,或者说在参数符合规定的时候才会执行我们真正想执行的内容。
如上面参数复用中的add(1)(2)(3),传入1 2 3的时候,函数并没有执行加法运算,只是将这个值推入队列中,仅当不传入参数时,才真正执行。