首頁  >  文章  >  web前端  >  使JavaScript進行斷舍離的函數分享

使JavaScript進行斷舍離的函數分享

小云云
小云云原創
2018-02-09 13:37:051045瀏覽

本文主要跟大家介紹了用函數式程式設計對JavaScript進行斷舍離,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。

關於DHTML

DHTML是Dynamic HTML的簡稱,就是動態的html(標準通用標記語言下的一個應用),是相對傳統的靜態的html而言的一種製作網頁的概念。所謂動態HTML(Dynamic HTML,簡稱DHTML),其實並不是新的語言,它只是HTML、CSS和客戶端腳本的一種集成,即一個頁面中包括html+css+javascript(或其它客戶端腳本),其中css和客戶端腳本是直接在頁面上寫而不是連結上相關文件。

在那個時候,JavaScript的演化很慢,主要應用在表單驗證。因此,不像今天這麼火爆,並沒有引起太多的關注。可以說只是一個錦上添花的附加物,你需要確保在瀏覽器停用JavaScript之後,你的應用程式仍然可以正常使用。再往後,框架一個接著一個出現:jQuery,Knockout, Angular, React, Vue, 等等。

同樣,JavaScript也在加速演化。我們才使用ES6不久,現在人們幾乎已經跳過ES7,開始討論ES8了。

並且,我們有很多替代品,像是TypeScript,CoffeScript,ClojureScript, ELM,等等。

我們已經被太多的框架和語言所淹沒,很難去追蹤和掌握所有的語言和框架。

錯誤路線

當JavaScript逐漸成熟,物件導向程式設計(OOP)的概念也滲透進來,而且我曾經很喜歡。

我開始嘗試所有不同的方法來建立類,我最終也可以正確的使用繼承。我對自己說:JavaScript開始真的像一個語言了!

但是,直到多年以後我發現OOP是JavaScript引進的最糟糕的一個設計!

我嘗試將我對C#的理解帶入JavaScript中去。一開始充滿期待,但後來發現真的太複雜,太燒腦了。

這主要是因為JavaScript的原型繼承和C#不一樣,我已經習慣每天寫類似console.log(this)這樣飄逸的程式碼。但是現在呢?如果我一不小心沒按照規則來,那將會帶給我惡夢。私有方法和私有值必須要在名字前面加上底線,甚至必須用閉包來保證私有。

因此,不僅OOP導致了許多問題,同時也因為新增OOP帶來了許多新的問題。

函數式程式設計

一開始我並不理解。我可以閱讀並理解這些用函數式編寫的程式碼,但我不知道為什麼!最終,我強迫我自己去學習它。

函數式語言給了我一個全新的視角,讓我從一個完全不同的方式去看待程式設計。

一開始會覺得不自然,需要時間適應。所有的定義都是基於函數,值不可更改,無狀態。我用函數式的思維去解決問題。因為不熟悉,我花了更長的時間學習。漸漸地,我熟練了使用函數式的方法去程式設計。並且,我也知道所有程式碼這樣寫的內在意義。

我的程式碼更簡潔了,而且很容易重複使用。漸漸的,我以前使用的那些語言特性從程式碼中消失了,我的程式碼看起來像是用另一個語言寫。我還在用JavaScript嗎?

1. 不再使用var

我用const取代了var。透過函數式的設計,我的函數都是純(pure)的。不會再去對一個變數進行值的變更操作,同樣也是為了確保不會對其操作。

我會檢查程式碼確保每一個var,甚至let,所有聲明都使用const。

2. 沒有for迴圈

在學習程式語言的時候,我們一開始就會學到for迴圈。但自從學習了函數式編程,我將for迴圈都改成了使用filter, map和reduce來實現。對於那些需要一些額外計算的需求,我會使用遞迴或則第三方函式庫例如lazy.js。

如今我的程式碼裡面完全沒有for循環了,如果你看到了,告訴我我會把它消除。

3. if也可以被簡化

我開始停止在if裡面寫大大塊的程式碼。我將裡面的邏輯抽取出來單獨放在一個函數中。這樣,我們就可以將if用三元算子(a?b:c)來簡化。

如今我的程式碼裡面幾乎沒有if語句。為了方便其他開發者理解我的程式碼,我很少使用它。

4. 和switch說拜拜

同樣,我也不喜歡用switch,而是找一個函數式的寫法。

我也很喜歡用Ramda的cond算子來取代swtich。

5. 不在擔心this

對的,你沒有聽錯!我們也可以完全消除this。

函数式的JavaScript可以让你完全抛弃使用烦人的this
现在只有数据和函数,甚至数据不过是函数的一种特殊表达形式,你再也不需要this了。我开始将对象理解为函数式语言中状态(state)和函数。我甚至不需要把状态或则函数和对象绑定到一起,就像OOP中那样。

面向对象的设计不是必须的

现在往回看,我发现面型对象编程带来的复杂度真的是不必要的。我可以使用函数式语言实现同样的功能,完成相同的任务。而且,代码更加轻简,因为不在需要将这些复杂的对象传来传去。只有数据和函数,而且因为函数没有和对象绑定,更加容易复用。我不在需要担心传统的原型继承带来的所有的问题,JavaScript设计的并不好。

JavaScript缺乏私有、公有、内部或则被保护这类访问控制器也不再是一个问题。访问控制器是用来解决由于引入面向对象编程而设计的。在函数式的JavaScript中,这些问题不复存在。

总结

我的代码现在看上去完全不同。它包含了很多纯函数,我将它们做成不同的ES6模块。这些函数可以被使用来构建更加复杂的函数。很大一部分函数都是很简单的一行lambda表达式。

现在我看待软件的思维也变了:输入是一个数据流,然后程序作用到该数据流上对数据进行各种操作,然后返回新的数据。

函数式设计对程序语言的影响以及无处不在,C#中的LINQ就是一个最佳的例子。同样Java 8也引入了函数式语言的特性。

相关推荐:

详细介绍XML行为(behavior)-新的DHTML?

以上是使JavaScript進行斷舍離的函數分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn