函数柯里化

88 阅读1分钟

定义

在计算机科学中,柯里化(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的时候,函数并没有执行加法运算,只是将这个值推入队列中,仅当不传入参数时,才真正执行。

参考链接:blog.csdn.net/zemprogram/…