函数柯里化:预先处理的思想「形成一个不被释放的闭包,把一些信息存储起来,基于作用域链,访问事先存储的信息,然后进行相关的处理,所有符合这种模式(或者闭包应用的)都被称为柯里化函数」
// x:原先存储值
function curring(x) {
// x->10
return function (...args) { // 基于Es6剩余运算符获取传递的实参信息-》数组;// return function () { // 也可基于arguments类数组实现,Array.from(arguments)
// args->[20]/[20,30]
args.unshift(x)
// 数组求和
/* 1.for循环
// 命令式编程-》怎么做,灵活管控运行步骤
var total = 0;
for (let i = 0; i < args.length; i++) {
total += args[i]
}
return total
*/
/* 2.forEach
// 函数式编程-》结果,使用方便,代码量少
var total = 0;
args.forEach(function (item) {
total += item;
})
return total
*/
/* 3.eval
var total = eval(args.join('+'))
return total
*/
/**
* 4.reduce
*/
return args.reduce((result, item) => result + item)
}
}
var sum = curring(10)
console.log(sum(20)) // 10+20
console.log(sum(20, 30)) // 10+20+30
/**
* 数组的reduce方法:在遍历数组的过程中,可以累积上一次处理的结果,基于上一次处理的结果继续遍历处理
* 数组.reduce([callback],[initialValue])
*/
// var arr = [10, 20, 30, 40]
// /*
// // 1.无初始值的情况
// var res = arr.reduce(function (result, item, index) {
// // [initialValue]初始值不传递,result默认初始值是数组第一项,然后reduce从数组第二项开始遍历
// // 每遍历数组中的一项,回调函数被触发执行一次
// // result 存储的是上一次回调函数返回结果(除了第一次是初始值或者数组第一项)
// // item 当前遍历这一项
// // index 当前遍历这一项的索引
// console.log(result)
// return item + result
// })
// console.log(res)
// */
// /*
// // 2.有初始值的情况
// var res = arr.reduce(function (result, item) {
// // 如果传递初始值,则result第一次的结果就是初始值,item从数组第一项开始遍历
// console.log(result)
// return item + result
// }, 0)
// console.log(res)
// */
// /**
// * 自己实现一个reduce
// */
// Array.prototype.reduce = function reduce(callback, initial) {
// var self = this,// this -> arr
// i = 0;
// if (typeof initial === 'undefined') {
// initial = self[0]
// i = 1
// }
// if (typeof callback !== 'function') throw new Error('callback must be a function')
// // 迭代数组每一项
// for (; i < self.length; i++) {
// var item = self[i],
// index = i;
// result = i;
// initial = callback(initial, item, index)
// }
// return initial
// }
// var total = arr.reduce((result, item) => {
// return result + item
// })