2.函数式编程前置知识(高阶函数)

本文介绍了JavaScript中函数作为一等公民的概念,详细阐述了如何将函数存储在变量中、作为参数传递和作为返回值。通过示例展示了高阶函数的用法,如forEach、filter等,并解释了使用高阶函数的意义,如抽象通用问题、简化代码。同时,文章还提到了map、every、some等其他常用高阶函数及其应用。

函数是一等公民

        函数可以存储在变量中

        函数作为参数

        函数作为返回值

在JavaScript中函数就是一个普通的对象(可以通过new function()),我们可以把函数存储到变量/数组中,它还可以作为另一个函数的参数和返回值,甚至我们可以在程序进行的时候通过new function(‘alert(1)’)来构造一个新的函数

        1.把函数赋值成一个变量

        

//fn就是这个函数,并不是函数返回的值 后面就可以用fn来调用这个函数
let fn=function(){
    console.log('Hello!!!');
}
console.log(fn);
fn();

这就是一个函数或方法赋值给另一个函数

//原型
//一个对象(BlogController)里有好多方法,在方法中,index和它函数里面的index的函数方法和参数一样则可以进行精简
const BlogController={
    index(posts) {return Views.index(posts)},
    show(post) {return Views.show(post)},
    creat(attrs) {return Views.show(attrs)},
    update(post,attrs) {return Views.update(post,attrs)},
    destroy(post) {return Views.destroy(post)}
}

//优化
//即把一个函数或方法赋值给另一个方法,注意不是把函数的调用赋值给另一个方法
const BlogController={
    index: Views.index,      //应该方法赋给另一个方法所以rerun和方法参数都不要
    show:Views.show,
    creat: Views.show,
    update: Views.update,
    destroy: Views.destroy
}

高阶函数(higher-order function)

        可以把函数作为参数传递给另一个函数

        可以把函数作为另一个函数的返回结果(函数是一等公民的特性)

        可以把函数作为参数传递给另一个函数

//高阶函数
function forEach(array,fn){
    for(let i=0;i<array.length;i++)
    {
        fn(array[i])
    }
}


let arr=[1,2,3,5,6,7,8]
forEach(arr,function (item){
    console.log(item)
})

//filter函数过滤
function filter(array,fn){
    let result=[];
    for(let i=0;i<array.length;i++)
    {
        if(fn(array[i]))
        {
            result.push(array[i])
        }
    }
    return result
}

//测试
let arr=[1,2,3,5,6,7,8]
let re= filter(arr,function(item){
    //输出值为偶数
    return item%2===0
})
console.log(re)

可以把函数作为另一个函数的返回结果(函数是一等公民的特性)

//高阶函数-函数作为返回值
function makeFn(){
    let msg='Hello ZLW'
    return function(){
        console.log(msg)
    }
}

const fn=makeFn()
fn()

第二种调用方法

如果一个函数的返回结果是另外一个函数就可以用fn()()

//高阶函数-函数作为返回值
function makeFn(){
    let msg='Hello ZLW'
    return function(){
        console.log(msg)
    }
}

// const fn=makeFn()
// fn()

makeFn()()

只运行一次

//once
function once(fn){
    let done=false
    return function(){
        if(!done){
            done=true
            //this表示function,arguments表示arguments --> 0:"5"
            return fn.apply(this,arguments)
        }
    }
}

let pay=once(function(money){
    console.log('支付:'+money+'RMB')
})

pay(5)
pay(5)

使用高阶函数的意义

        抽象可以帮我们屏蔽细节,只需要关注与我们的目标

        高阶函数时用来抽象通用的问题

        使函数更加简捷

//高阶函数
function forEach(array,fn){
    for(let i=0;i<array.length;i++)
    {
        fn(array[i])
    }
}

let arr=[1,2,3,5,6,7,8]
forEach(arr,item=>{
    console.log(item)
})

//filter函数过滤
function filter(array,fn){
    let result=[];
    for(let i=0;i<array.length;i++)
    {
        if(fn(array[i]))
        {
            result.push(array[i])
        }
    }
    return result
}

//测试
let arr=[1,2,3,5,6,7,8]
let r=filter(arr,item=>{
    return item %2===0
})
console.log(r)

常用的高阶函数

forEach

map //对数组中每个数进行遍历,并对数进行处理,处理后的结果放在一个新的数组中返回

会让map函数变得更灵活

//map 对数组中每个数进行遍历,并对数进行处理,处理后的结果放在一个新的数组中返回
const map=(array,fn)=>{
    let result=[]
    for(let value of array){
        result.push(fn(value))
    }
    return result
}

//测试
let arr=[1,2,3,5,6]
arr =map(arr,v=>v*v)

console.log(arr)

filter

every  //用来匹配数组中的元素都匹配我们指定的条件

//every
const every=(array,fn)=>{
    let result=true
    for(let value of array){
        result =fn(value)
        if(!result){
            break
        }
    }
    return result
}

//测试
let arr=[11,10,5,6,9,20,13]
let r=every(arr,v=>v>1)
console.log(r)

some //用来匹配数组中的元素某一个能匹配我们指定的条件就行

const some=(array,fn)=>{
    let result=false
    for(let value of array){
        result =fn(value)
        if(result)
        {
            break
        }
    }
    return result
}

let arr=[11,10,5,6,9,20,13]
let r=some(arr,v=>v<20)
console.log(r)

find/findindex

reduce

sort

......

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值