在JS中实践函数式编程【3】 -- 状态

写在文章前

函数式编程第三话~ 上次介绍了一些简单的概念,此次咱们研究一下状态。javascript

文章若是有什么不对的地方欢迎在评论区批评指正。前端

状态

上次说到什么是一等函数 什么是高阶函数以及纯函数。那接下来咱们来研究一下函数式编程中 ,纯函数究竟是如何帮助咱们的。vue

首先咱们要知道一个词: 状态。 前端的小伙伴必定对状态这个词不陌生,在vue 和react 中都有强大的状态管理器作支撑。那到底什么是状态呢?java

简单的理解就是当前关于事物的一个描述。人的状态就是一我的当前样子的描述。程序的状态就是程序当前各个组成部分的状态:好比变量当前的值,好比已经分配了的线程的状况等等。。其实应用程序的状态就是当前正在发生信息的汇总。这么说有点抽象,咱们来举个例子:react

let userInfo = {
    accountNo: 'No000001',
    id: 1,
    name: 'john smith'
};
let readingBooks = 0;
let owningBooks = 0;

owningBooks = owningBooks + 1;
readingBooks = readingBooks + 1;

let buyBooksFromDangDang = (hasCheckout) => {
    let booksAmount = 3;
    if (hasCheckout) {
        owningBooks = owningBooks + booksAmount;
    }
    return booksAmount;
}


复制代码

代码中咱们看到修改全局状态的状况,若是是全局状态(userInfo,readingBooks)的话,在任何地方任何代码均可以修改这些变量的值。但若是是在函数做用域中咱们声明的局部变量(booksAmount)的话,在函数的外部是没有办法访问这些局部变量的。而且在每一次咱们去执行buyBooksFromDangDang的时候,变量booksAmount 都会被建立一次,而且初始化赋值为3。编程

对于一个应用程序来讲,他的状态不单单只是他的全局变量,还有他的每个组件内部私有的值等等。每一个组件内部的函数,函数内部的变量,函数内部的函数,函数内部的函数的变量(递归下去)等等。bash

共享状态

共享状态的好处就是任何地方都能访问这些变量,共享状态的缺点也是任何地方都能访问这些变量。js又是一个单线程的语言,咱们也没有锁的机制,因此全部关于共享变量的控制都是由咱们本身来完成的。这就极可能会形成不知道何时,改变了这个变量就致使了一些错误,这些错误若是是在一个复杂的程序中会变得难以定位,由于谁(任何函数)都有权限去更改。因此使用共享状态的时候要慎重,共享给的代码块越多越要慎重。函数式编程

那怎么办,我若是有变量要共享怎么办?函数

参数

let buyBooksFromDangDang = (hasCheckout) => {
    let booksAmount = 3;
    if (hasCheckout) {
        booksAmoiunt = owningBooks + booksAmount;
    }
    return booksAmount;
}
复制代码

首先,在说参数以前,咱们先来思考一下,这些咱们须要共享的变量他们真的有必要被共享吗? 就拿上面的代码块来讲,在buyBooksFromDangDang中咱们引用了全局变量owningBooks. 那若是owningBooks更改了的话,booksAmount的结果也会跟着改变。那怎样才能让咱们的结果保证可控呢?ui

let buyBooksFromDangDang = (hasCheckout, owningBooks) => {
    let booksAmount = 3;
    if (hasCheckout) {
        booksAmoiunt = owningBooks + booksAmount;
    }
    return booksAmount;
}
复制代码

咱们能够将owningBooks 做为参数传入函数,这样就不会有那种“在执行的时候,咱们不知道值是什么”的状况。

但要注意,咱们须要保证传入参数的不可变性。举个很是常见的例子,咱们若是传入了一个对象,而后对某个属性作了更改,或者咱们作了浅拷贝而后作了更改。。。这时的对象就已经不是咱们初次相识的样子了,对象的值已经不可控了。

函数式编程要求咱们总要返回全新的对象,而且不会对传入的参数进行任何的改变。固然对于一些必要的使用全局变量的状况,仍是别勉强本身了,作个愉快CRUD Boy吧:)

总结

此次介绍了状态的一些知识点,以及公共变量的一些问题,但其实咱们没有很仔细的说明到底公共变量与咱们以前提的纯函数以及函数式编程的具体关系。接下来,咱们会具体的讲一下他们之间的关系。

【PS】公司依旧还在招聘,须要内推的小伙伴欢迎私戳。

相关文章
相关标签/搜索