函数的副作用,高阶函数

509 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

函数是一个非常重要的改变,函数式编程就是一种证明!

函数式编程中有很多重要的概念,我们今天就谈谈比较常见和好理解的 函数副作用, 高阶函数。

函数副作用

指调用函数时,除了返回函数值之外,还对外界产生附加的影响。 副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。

与副作用,对用的还有一个概念,纯函数。

纯函数的定义:
纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

即: 同入同出 + 无副作用。

副作用可能包含,但不限于:

  • 修改了变量

    var rate = 1;
    function sum(sum1, sum2){
        rate = 2;
        return sum1 + sum2
    }
    

    其对外面的变量rate进行了修改

  • 修改了入参

    function sum(sum1, sum2){
        sum1 = 10;
        return sum1 + sum2
    }
    

    其对入参sum1做了修改。 更严重的是如果对引用类型的参数做了修改,即有可能导致后面的程序发生意外, 所以,我们如果可能会修改入参,一定要使用复制,

  • 输出了日志
    没错,你即使是用了console.log,也就是有了副作用。

  • 操作了DOM
    操作DOM也不行

  • 发送了http请求
    发送请求也不行,因为你发了请求,导致外面的世界发生了变了。

  • 操作客户端存储
    比如cookie, storage, indexedDB等等

  • 与service worker, iframe通讯等等

高阶函数

高阶函数是一个接收函数作为参数或将函数作为输出返回的函数。

  • 函数为入参
  • 函数为返回值

满足任一条件即可。 衍生除了 高阶组件。

我们平时使用的数组的方法基本都是:

  • Array.prototype.filter
  • Array.prototype.find
  • Array.prototype.map 等等,因为他们都是以函数为入参的。

柯里化, 就是高阶函数的一种典型应用。
Function.prototype.bind那你说是不是高阶函数呢?

高阶函数的目的很明确,复用 + 美化代码,没错吧,在座的各位!

小结

今天我们简单学习了副作用和高阶函数, 下期再见哦! 今天你收获了吗?

mostly-adequate-guide-chinese
Functional-Light-JS
fp-jargon-zh