SOURCE

// 也是闭包
// 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 命令行工具 X clear

                    
>
console