柯里化 / 高階函數(shù)
柯里化:將 f(x,y) 變成 f(x=1)(y) 或 f(y=1)x
//柯里化之前
function sum(x,y){
return x+y
}
//柯里化之后
function addOne(y){
return sum(1, y)
}
//柯里化之前
function Handlebar(template, data){
return template.replace('{{name}}', data.name)
}
//柯里化之后
function Handlebar(template){
return function(data){
return template.replace('{{name}}', data.name)
}
}
重點(diǎn)E翱椤!欲账!柯里化可以將真實(shí)計(jì)算拖延到最后再做撒汉,也就是如果一個(gè)函數(shù)返回的函數(shù)參數(shù)比原函數(shù)要少一個(gè)那就是柯里化轿钠。
關(guān)于柯里化的高級(jí)文章:
高階函數(shù):
在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,高階函數(shù)是至少滿足下列一個(gè)條件的函數(shù):
接受一個(gè)或多個(gè)函數(shù)作為輸入:forEach sort map filter reduce
輸出一個(gè)函數(shù):lodash.curry
不過它也可以同時(shí)滿足兩個(gè)條件:Function.prototype.bind
習(xí)題:
請(qǐng)寫出一個(gè)柯里化其他函數(shù)的函數(shù) curry病苗,這個(gè)函數(shù)能夠?qū)⒔邮芏鄠€(gè)參數(shù)的函數(shù)疗垛,變成多個(gè)接受一個(gè)參數(shù)的函數(shù),具體見示例:
function curry(???){
???
return ???
}
var abc = function(a, b, c) {
return [a, b, c];
};
var curried = curry(abc);
curried(1)(2)(3);
// => [1, 2, 3]
curried(1, 2)(3);
// => [1, 2, 3]
curried(1, 2, 3);
// => [1, 2, 3]
本人答案(略有不足硫朦,日后完善)
function curry (fn) {
var temp = [];
var argnum = 0;
return function () {
if (fn.length == arguments.length) {
return fn.apply(null, arguments)
} else {
if (temp.length == fn.length) {
temp = [];
}
argnum += arguments.length
temp = temp.concat(Array.prototype.slice.call(arguments))
console.log(temp)
console.log(argnum)
if (argnum == fn.length) {
argnum = 0;
return temp
}
return arguments.callee
}
}
}