函數式編程第三話~ 上次介紹了一些簡單的概念,此次咱們研究一下狀態。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】公司依舊還在招聘,須要內推的小夥伴歡迎私戳。