什么是函数柯里化?
就是将一个多参数函数,转换为单一参数(原参数的第一个)的函数,并在其返回函数中传入余下参数、返回结果。
柯里化有哪些好处?
参数复用
在以下柯里化函数中,只需要第一次传入正则表达式,后面只要是检测同一正则表达式就只需调用返回的函数
function check(reg){ return function(str){ return reg.test(str); } } var checknum = check(/^[0-9]+$/); var checkStr = check(/^[a-zA-Z]+$/); console.log(checknum('123456')); console.log(checknum('1234sd')); console.log(checkStr('adafd')); console.log(checkStr('ads2'));
提前判断
在以下代码中,提前判断浏览器是否支持addEventListener,再返回相应函数,就不用每次注册事件都进行判断
var on = (function () { if (document.addEventListener) { return function (element, event, handler) { if(element && event && handler){ element.addEventListener(event, handler, false) } }; }else{ return function(element, event, handler){ if(element && event && handler){ element.attachEvent('on' + event, handler) } } } })();
实现bind函数、延迟执行
为函数改变this指向,并返回函数,执行函数才会执行
Function.prototype.bind = function(context){ var _this = this; var args = Array.prototype.slice.call(arguments, 1); return function () { return _this.apply(context, args.concat(Array.prototype.slice.call(arguments))) } }
通用封装
function currying(fn) { var l = fn.length, args = []; var result = function (arg) { args.push(arg); l--; if (l <= 0) { return fn.apply(this, args); }else{ return result; } } return result; }