1. 是什么?
柯里化是一种将使用多个参数
的一个函数转换成
一系列使用一个参数
的函数的编程技术。
简单示例:
1 2 3 4 5 6 7 8 9
| function add(a, b) { return a + b; }
add(1, 2)
var addCurry = curry(add);
addCurry(1)(2)
|
2. curry函数的编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
function curry(fn, args) { var length = fn.length; args = args || []; return function() { var _args = args.slice(0), arg, i; for (i = 0; i < arguments.length; i++) { arg = arguments[i]; _args.push(arg); } if (_args.length < length) { console.log(this) return curry.call(this, fn, _args); } else { return fn.apply(this, _args); } } }
var fn = curry(function(a, b, c) { console.log([a, b, c]); });
fn("a", "b", "c") fn("a", "b")("c") fn("a")("b")("c") fn("a")("b", "c")
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var addEvent = (function() { if(window.addEventListener) { return function(el, type, fn, capture) { el.addEventListener(type, function(e) { fn.call(el, e); }, capture); } }else { return function(ele, type, fn) { el.attachEvent('on' + type, function(e) { fn.call(el, e); }) } } })()
|
3. curry函数写法的引申思考
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function testFn() { for (let i = 0; i < 3; i++ ) { console.log(i) } return function () { return 123 } } var k = testFn() console.log(k()) console.log(k()) console.log(k())
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function makeMap(tagStr) { const tagArr = tagStr.split(','); const tagObj = {}; for (const tag of tagArr) { tagObj[tag] = true; } return function (tagName) { return !!tagObj[tagName]; } }
const isHTMLTag = makeMap('div,p,span,h1'); console.log(isHTMLTag('div'));
|
4. curry函数的特点与作用
参考文章:
javascript.Info
冴羽github文章
arguments
和function.length
的区别
Function.length
github闭包论坛