摘要:函數(shù)式編程一開始我并不理解。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。但是自從學(xué)習(xí)了函數(shù)式編程,我將循環(huán)都改成了使用和來實現(xiàn)。只有數(shù)據(jù)和函數(shù),而且因為函數(shù)沒有和對象綁定,更加容易復(fù)用。在函數(shù)式的中,這些問題不復(fù)存在。
譯者按: 當(dāng)從業(yè)20的JavaScript老司機學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅?,最后發(fā)現(xiàn)了真愛?。。?!
原文: How I rediscovered my love for JavaScript after throwing 90% of it in the trash.
譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯,并且對源代碼進行了大量修改。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
我和JavaScript從1997年網(wǎng)景的Navigator 3瀏覽器開始就開始使用JavaScript。當(dāng)時,JavaScript還只能做一些很簡單的事情。我記得最酷的就是用JavaScript實現(xiàn)mouseover特性,在那個時候已經(jīng)算得上是高科技了!當(dāng)鼠標(biāo)移過去之后,文本內(nèi)容就神奇的改變了。因為當(dāng)時都是pre-DHTML,你根本不需要隱藏或則顯示DOM元素。
關(guān)于DHTML(以前的 DHTML 如今是不是也算前端?):
DHTML是Dynamic HTML的簡稱,就是動態(tài)的html(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個應(yīng)用),是相對傳統(tǒng)的靜態(tài)的html而言的一種制作網(wǎng)頁的概念。所謂動態(tài)HTML(Dynamic HTML,簡稱DHTML),其實并不是一門新的語言,它只是HTML、CSS和客戶端腳本的一種集成,即一個頁面中包括html+css+javascript(或其它客戶端腳本),其中css和客戶端腳本是直接在頁面上寫而不是鏈接上相關(guān)文件。
在那個時候,JavaScript的演化很慢,主要應(yīng)用在表單驗證。因此,不像今天這么火爆,并沒有引起太多的關(guān)注。可以說只是一個錦上添花的附加物,你需要確保在瀏覽器禁用JavaScript之后,你的應(yīng)用依然可以正常使用。再往后,框架一個接著一個出現(xiàn):jQuery,Knockout, Angular, React, Vue, 等等。
同樣,JavaScript也在加速演化。我們才使用ES6不久,現(xiàn)在人們幾乎已經(jīng)跳過ES7,開始討論ES8了。
并且,我們有很多替代品,比如TypeScript,CoffeScript,ClojureScript, ELM,等等。
我們已經(jīng)被太多的框架和語言所淹沒,很難去跟蹤和掌握所有的語言和框架。
錯誤路線當(dāng)JavaScript逐漸成熟,面向?qū)ο缶幊?OOP)的概念也滲入進來,而且我曾經(jīng)很喜歡。
我開始嘗試所有不同的方法來創(chuàng)建類,我最終也可以正確的使用繼承。我對自己說:JavaScript開始真的像一個語言了!
但是,直到多年以后我發(fā)現(xiàn)OOP是JavaScript引入的最糟糕的一個設(shè)計!
我嘗試將我對C#的理解帶入到JavaScript中去。一開始充滿期待,但是后來發(fā)現(xiàn)真的太復(fù)雜,太燒腦了。
這主要是因為JavaScript的原型繼承和C#不一樣,我已經(jīng)習(xí)慣于每天編寫類似于console.log(this)這樣飄逸的代碼。但是現(xiàn)在呢?如果我一不小心沒按照規(guī)則來,那將會給我?guī)碡瑝簟K接蟹椒ê退接兄当仨氁诿智懊婕由舷聞澗€,甚至必須用閉包來保證私有性。
因此,不僅OOP導(dǎo)致了很多問題,同時也由于添加OOP帶來了很多新的問題。
函數(shù)式編程一開始我并不理解。我可以閱讀并理解這些用函數(shù)式編寫的代碼,但是不知道為什么!最終,我強迫我自己去學(xué)習(xí)它。我在在線教育網(wǎng)站EDX免費學(xué)習(xí)了函數(shù)式語言的入門課程,然后嘗試把這些技術(shù)運用到JavaScript中去。
函數(shù)式語言給了我一個全新的視角,讓我從一個完全不同的方式去看待編程。
一開始會感到不自然,需要時間去適應(yīng)。所有的定義都是基于函數(shù),值不可更改,無狀態(tài)。我用函數(shù)式的思維去解決問題。因為不熟悉,我花了更長的時間去學(xué)習(xí)。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。并且,我也知道所有代碼這樣編寫的內(nèi)在含義。
我的代碼更加簡潔了,而且容易復(fù)用。漸漸的,我以前使用的那些語言特性從代碼中消失了,我的代碼看上去完像是用另一個語言編寫。我還在用JavaScript嗎?
1. 不再使用var我用const替代了var。通過函數(shù)式的設(shè)計,我的函數(shù)都是純(pure)的。不會再去對一個變量進行值的變更操作,同樣也是為了確保不會對其操作。
我會檢查代碼確保每一個var,甚至let,所有聲明都使用const。
2. 沒有for循環(huán)在學(xué)習(xí)程序語言的時候,我們一開始就會學(xué)到for循環(huán)。但是自從學(xué)習(xí)了函數(shù)式編程,我將for循環(huán)都改成了使用filter, map和reduce來實現(xiàn)。對于那些需要一些額外計算的需求,我會使用遞歸或則第三方庫比如lazy.js。
在此,推薦我的另外一篇專門介紹for循環(huán)博客:Rethinking JavaScript: Death of the For Loop
如今我的代碼里面完全沒有for循環(huán)了,如果你看到了,告訴我我會把它消除。
3. if也可以被簡化我開始停止在if里面編寫大塊大塊的代碼。我將里面的邏輯抽取出來多帶帶放在一個函數(shù)中。這樣,我們就可以將if用三元算子(a?b:c)來簡化。
在此,推薦我的另外一篇專門介紹if博客:Rethinking JavaScript: The if statement
如今我的代碼里面幾乎沒有if語句。為了方便其他開發(fā)者理解我的代碼,我很少使用它。
4. 和switch說拜拜同樣,我也不喜歡用switch,而是尋找一個函數(shù)式的寫法。
推薦我的博客: Rethinking JavaScript: Eliminate the switch statement for better code
我也很喜歡用Ramda的cond算子來替代swtich。
5. 不在擔(dān)心this對的,你沒有聽錯!我們也可以完全消除this。
函數(shù)式的JavaScript可以讓你完全拋棄使用煩人的this
現(xiàn)在只有數(shù)據(jù)和函數(shù),甚至數(shù)據(jù)不過是函數(shù)的一種特殊表達(dá)形式,你再也不需要this了。我開始將對象理解為函數(shù)式語言中狀態(tài)(state)和函數(shù)。我甚至不需要把狀態(tài)或則函數(shù)和對象綁定到一起,就像OOP中那樣。
我寫了一篇博客專門介紹如何解耦: Functional JavaScript: Decoupling methods from their objects
面向?qū)ο蟮脑O(shè)計不是必須的現(xiàn)在往回看,我發(fā)現(xiàn)面型對象編程帶來的復(fù)雜度真的是不必要的。我可以使用函數(shù)式語言實現(xiàn)同樣的功能,完成相同的任務(wù)。而且,代碼更加輕簡,因為不在需要將這些復(fù)雜的對象傳來傳去。只有數(shù)據(jù)和函數(shù),而且因為函數(shù)沒有和對象綁定,更加容易復(fù)用。我不在需要擔(dān)心傳統(tǒng)的原型繼承帶來的所有的問題,JavaScript設(shè)計的并不好。
JavaScript缺乏私有、公有、內(nèi)部或則被保護這類訪問控制器也不再是一個問題。訪問控制器是用來解決由于引入面向?qū)ο缶幊潭O(shè)計的。在函數(shù)式的JavaScript中,這些問題不復(fù)存在。
總結(jié)我的代碼現(xiàn)在看上去完全不同。它包含了很多純函數(shù),我將它們做成不同的ES6模塊。這些函數(shù)可以被使用來構(gòu)建更加復(fù)雜的函數(shù)。很大一部分函數(shù)都是很簡單的一行l(wèi)ambda表達(dá)式。
現(xiàn)在我看待軟件的思維也變了:輸入是一個數(shù)據(jù)流,然后程序作用到該數(shù)據(jù)流上對數(shù)據(jù)進行各種操作,然后返回新的數(shù)據(jù)。
函數(shù)式設(shè)計對程序語言的影響以及無處不在,C#中的LINQ就是一個最佳的例子。同樣Java 8也引入了函數(shù)式語言的特性。
版權(quán)聲明:
轉(zhuǎn)載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88747.html
摘要:用函數(shù)式編程對進行斷舍離當(dāng)從業(yè)的老司機學(xué)會函數(shù)式編程時,他扔掉了的特性,也不用面向?qū)ο罅?,最后發(fā)現(xiàn)了真愛啊作用域和閉包作用域和閉包在里非常重要。旨在幫助非函數(shù)式編程的同學(xué),能快速切入到函數(shù)式編程的理念。 1、用函數(shù)式編程對JavaScript進行斷舍離 當(dāng)從業(yè)20的JavaScript老司機學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛?。。。?https:/...
摘要:用函數(shù)式編程對進行斷舍離當(dāng)從業(yè)的老司機學(xué)會函數(shù)式編程時,他扔掉了的特性,也不用面向?qū)ο罅?,最后發(fā)現(xiàn)了真愛啊作用域和閉包作用域和閉包在里非常重要。旨在幫助非函數(shù)式編程的同學(xué),能快速切入到函數(shù)式編程的理念。 1、用函數(shù)式編程對JavaScript進行斷舍離 當(dāng)從業(yè)20的JavaScript老司機學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅?,最后發(fā)現(xiàn)了真愛啊?。?! https:/...
摘要:用函數(shù)式編程對進行斷舍離當(dāng)從業(yè)的老司機學(xué)會函數(shù)式編程時,他扔掉了的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛啊作用域和閉包作用域和閉包在里非常重要。旨在幫助非函數(shù)式編程的同學(xué),能快速切入到函數(shù)式編程的理念。 1、用函數(shù)式編程對JavaScript進行斷舍離 當(dāng)從業(yè)20的JavaScript老司機學(xué)會函數(shù)式編程時,他扔掉了90%的特性,也不用面向?qū)ο罅?,最后發(fā)現(xiàn)了真愛啊?。。?https:/...
摘要:前端主要關(guān)注于應(yīng)用層的協(xié)議,傳輸層的協(xié)議斷舍離一下,就主要總結(jié)這兩種協(xié)議了。是序號,是確認(rèn)序號。根據(jù)服務(wù)端發(fā)來的返回一個包給服務(wù)端。服務(wù)端接收后進入狀態(tài)。并在兩端維護了索引表,用于記錄出現(xiàn)過的,避免重復(fù)傳輸。 前端主要關(guān)注于應(yīng)用層的 HTTP 協(xié)議,傳輸層的 TCP 協(xié)議,斷舍離一下,就主要總結(jié)這兩種協(xié)議了。 OSI 參考模型 與 TCP/IP 五層模型 showImg(https:/...
摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫遵循的實際標(biāo)準(zhǔn)。與輕量級函數(shù)式編程的概念相反,它以火力全開的姿態(tài)進軍的函數(shù)式編程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅實的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),...
閱讀 925·2021-10-18 13:32
閱讀 3527·2021-09-30 09:47
閱讀 2168·2021-09-23 11:21
閱讀 1893·2021-09-09 09:34
閱讀 3493·2019-08-30 15:43
閱讀 1533·2019-08-30 11:07
閱讀 1072·2019-08-29 16:14
閱讀 737·2019-08-29 11:06