// 也是闭包
// function once (fn){
// let done = false
// return function(){
// if(!done){
// done = true
// return fn.apply(this,arguments)
// }
// }
// }
// let pay = once(function(money){
// console.log(`${money}`)
// })
// pay(5)
// map
// const map = (arr,fn)=>{
// let res = []
// for(let value of arr){
// res.push(fn(value))
// }
// return res
// }
// let arrs = [1,2,3,4]
// console.log(map(arrs,v=>v*v))
// every
// const every = (arr,fn)=>{
// let res= true
// for(let value of arr){
// res = fn(value)
// if(!res){
// break
// }
// }
// return res
// }
// let arrs = [1,2,3,4,10]
// console.log(every(arrs,v=>v<10))
// some
// const some = (arr,fn)=>{
// let res = false
// for(let value of arr){
// res = fn(value)
// if(res){
// break
// }
// }
// return res
// }
// let arr = [1,3,5,6]
// console.log(some(arr,v=>v%2 ===0))
// 闭包 案例 求任意平方和
// function makePower(po){
// return function(num){
// return Math.pow(num,po)
// }
// }
// let pow2= makePower(2)
// // call stack 函数调用栈
// // scope 作用域
// // script let定义的变量 自己的作用域
// // closure 闭包
// let poe3 = makePower(3)
// console.log(pow2(3))
// 纯函数
// 相同的输入得到相同的输出(是否改变原‘数组’) 副作用?
// 纯函数和不纯函数
// let arr = [1,2,3,4,5,6,7]
// // 纯
// console.log(arr.slice(0,3))
// console.log(arr.slice(0,3))
// console.log(arr.slice(0,3))
// // 不纯
// console.log(arr.splice(0,3))
// console.log(arr.splice(0,3))
// console.log(arr.splice(0,3))
// // 自定义纯函数
// function getSun(n1,n2){
// return n1+n2
// }
// console.log(getSun(1,2))
// console.log(getSun(1,2))
// console.log(getSun(1,2))
// loadsh
// let arr = [1,2,3,4,5,6,7]
// console.log(_.first(arr))
// console.log(_.last(arr))
// const r = _.each(arr,(item,index)=>{
// console.log(item,index)
// })
// console.log(_.each)
// 纯函数的好处
// 可缓存----记忆函数
// function getArea (r){
// console.log(r)
// // 只调用了一次
// return Math.PI*r*r
// }
// let mom = _.memoize(getArea)
// console.log(mom(4))
// console.log(mom(4))
// console.log(mom(4))
// 模拟momeize
// function getArea (r){
// console.log(r)
// // 只调用了一次
// return Math.PI*r*r
// }
// function memoize (f){
// let cache = {}
// return function(){
// let key = JSON.stringify(arguments)
// cache[key] = cache[key] || f.apply(f,arguments)
// return cache[key]
// }
// }
// let mom = memoize(getArea)
// console.log(mom(4))
// console.log(mom(4))
// console.log(mom(4))
// 可测试 测试更方便 (无案例)
// 并行处理(无案例)
// 副作用--纯函数没有可观察的副作用
// 下面为不纯的案例,mini可能会变 这个全局变量就是副作用的来源 导致不纯
// let mini = 18
// function checkage (age) {
// return age > mini
// }
// console.log(checkage(20))
// 所有的外部交互都有可能代理副作用
// 副作用可以导致不纯
// 副作用不可能完全禁止
// 柯里化 对checkage进行改造
// mini硬编码
// let mini = 18
// function checkage (age) {
// return age > mini
// }
// 第一步改造 普通的纯函数
// function checkage(min,age){
// return age>min
// }
// console.log(checkage(18,24))
// console.log(checkage(18,20))
// console.log(checkage(18,23))
// 第二步改造 闭包
// function checkage(min){
// return function(age){
// return age>min
// }
// }
// let checkage18 = checkage(18)
// let checkage20 = checkage(20)
// console.log(checkage18(20))
// console.log(checkage18(22))
// console.log(checkage20(22))
// 柯里化 多个参数时,可以改造成传入部分参数,返回一个新方法
// 第三步 箭头改造(柯里化)
// let checkage = min=>(age=>age>min)
// let checkage18 = checkage(18)
// let checkage20 = checkage(20)
// console.log(checkage18(20))
// console.log(checkage18(22))
// console.log(checkage20(22))
// loadsh中的柯里化方法
// curry 本身就是纯函数 如果传入全部参数则执行方法,如果传入部分参数,则返回一个方法等待剩余参数
// 如果传入的是个纯函数,则返回的也是一个纯函数
// function getSum (a,b,c){
// return a+b+c
// }
// const curred = _.curry(getSum)
// console.log(curred(1,2,3))
// const curred1 = curred(1)(2,3)
// console.log(curred1)
// const curred2 = curred(1)
// console.log(curred2)
// console.log(curred2(2,3))
// 案例2
// 柯里化
const match= _.curry(function (reg,str){
return str.match(reg)
})
const haceSpace = match(/\s+/g)
console.log(haceSpace("aaa vbv"))
// 案例3 结合案例2
const filter = _.curry(function(func,arry){
return arry.filter(func)
})
console.log(filter(haceSpace,["aaa aaa","bbbb"]))
console