柯里化
一、柯里化
柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
例如这样:
//柯里化前 function add(a, b) { return a + b; } add(10, 2) // 12 //柯里化后 var add = function(a) { return function(b) { return a + b; }; }; var addTen = add(10); addTen(2); // 12
二、利用柯里化实现累加器
function fn(){ var numList = [].slice.call(arguments); var _fn = function(){ var innerArguments = [].slice.call(arguments); numList = numList.concat(innerArguments); return _fn; } _fn.valueOf = function(){ return numList.reduce(function(num1, num2){ return num1 + num2; }); } return _fn; } console.log(fn(1)(2)(3));
这段代码初看可能不太好理解,这里我们将它拆分一下:
arguments对象
戳MDN,介绍的特别详细。
每一个js函数内部都有arguments,它代表传入的参数数组。arguments 是一个类数组对象。可以用下面的语句将arguments转化成数组对象:
var numList = [].slice.call(arguments); //将arguments转化成数组对象
还有常用的:[].slice.call(arguments, 1)
返回的是arguments数组从1号位开始的片段。用来获取arguments
里除了第一项以外的其他所有选项。
valueOf() 方法
返回 Boolean 对象的原始值:
<script type="text/javascript">
var boo = new Boolean(false);
document.write(boo.valueOf()); //false
</script>
这里也可以使用添加 toString()
的方式实现这一功能,与 valueOf()
做法一致。
reduce()方法
接收一个函数作为累加器。语法:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
使用范例:
var numbers = [65, 44, 12, 4]; function getSum(total, num) { return total + num; } function myFunction(item) { document.getElementById("demo").innerHTML = numbers.reduce(getSum); }
递归
可以看我的另一篇博客:递归
思路总结
首先若是想要实现 fn()()
这种调用方式的函数,则在 fn
函数体内一定也会返回一个函数。若是想要实现 fn()()()...
不定次数的调用,则意味着每一层的返回值均为一个函数,这就需要使用类似递归的方式去实现。在函数调用的最后一层,这个返回值应该是一个值而非函数,这里则需要使用 valueOf
这一方法。使用内置对象 arguments
对函数中所传入的参数获取,arguments
不是数组,而是对象,将其转换为数组。使用数组的reduce
方法实现求和。
学习并感谢:
2、柯里化实现累加器
3、柯里化与箭头函数