高阶函数

高阶函数

一个函数作为另一个函数的参数传递,那么另一个函数就称为高阶函数

闭包的概念:一个函数有权访问另一个函数作用域的函数
  • 场景1:实现一个定时器,每隔1s打印一个数字,如1,2,3,4
for(let i = 0 ; i < 6 ; i++){
    var fun1 = function(e){
        setTimeout(()=>{
            console.log(e)
        },1000*e)
    }
    fun1(i)
}
for(let i = 0 ; i < 6 ; i ++){
    (function(e){
        setTimeout(()=>{
            console.log(e)
        },1000*e)
    })(i)
}
//这里是运用了块级作用域的绑定实现的
for(let i = 0 ; i< 5 ;i++){
    setTimeout(()=>{
        console.log(i)
    },1000*i)
}
  • 场景2:函数柯里化
//三个好处:参数复用,提前确定,延迟执行
var compare = function(x){
    return function(y){
        return x>y
    }
}
var compare20 = compare(20)
console.log(compare20(30))
console.log(compare20(10))
console.log(compare20(0))
console.log(compare20(40))

//手写一个柯里化的函数

function curry (fn) {
    return function curriry (...args) {
        return args.length >= fn.length ? fn.apply(null,args) : curriry.bind(null,...args)
    }
}
var add = function(x,y,z){
    return x+y+z
}
let sumFun = curry(add)

console.log(sumFun(2)(2)(6))