最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解用函數(shù)式編程對JavaScript進行斷舍離

 更新時間:2017年09月18日 15:48:00   作者:Fundebug  
本篇文章主要介紹了用函數(shù)式編程對JavaScript進行斷舍離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

我和JavaScript

從1997年網(wǎng)景的Navigator 3瀏覽器開始就開始使用JavaScript。當時,JavaScript還只能做一些很簡單的事情。我記得最酷的就是用JavaScript實現(xiàn)mouseover特性,在那個時候已經(jīng)算得上是高科技了!當鼠標移過去之后,文本內容就神奇的改變了。因為當時都是pre-DHTML,你根本不需要隱藏或則顯示DOM元素。

關于DHTML

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

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

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

并且,我們有很多替代品,比如TypeScript,CoffeScript,ClojureScript, ELM,等等。

我們已經(jīng)被太多的框架和語言所淹沒,很難去跟蹤和掌握所有的語言和框架。

錯誤路線

當JavaScript逐漸成熟,面向對象編程(OOP)的概念也滲入進來,而且我曾經(jīng)很喜歡。

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

但是,直到多年以后我發(fā)現(xiàn)OOP是JavaScript引入的最糟糕的一個設計!

我嘗試將我對C#的理解帶入到JavaScript中去。一開始充滿期待,但是后來發(fā)現(xiàn)真的太復雜,太燒腦了。

這主要是因為JavaScript的原型繼承和C#不一樣,我已經(jīng)習慣于每天編寫類似于console.log(this)這樣飄逸的代碼。但是現(xiàn)在呢?如果我一不小心沒按照規(guī)則來,那將會給我?guī)碡瑝?。私有方法和私有值必須要在名字前面加上下劃線,甚至必須用閉包來保證私有性。

因此,不僅OOP導致了很多問題,同時也由于添加OOP帶來了很多新的問題。

函數(shù)式編程

一開始我并不理解。我可以閱讀并理解這些用函數(shù)式編寫的代碼,但是不知道為什么!最終,我強迫我自己去學習它。

函數(shù)式語言給了我一個全新的視角,讓我從一個完全不同的方式去看待編程。

一開始會感到不自然,需要時間去適應。所有的定義都是基于函數(shù),值不可更改,無狀態(tài)。我用函數(shù)式的思維去解決問題。因為不熟悉,我花了更長的時間去學習。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。并且,我也知道所有代碼這樣編寫的內在含義。

我的代碼更加簡潔了,而且容易復用。漸漸的,我以前使用的那些語言特性從代碼中消失了,我的代碼看上去完像是用另一個語言編寫。我還在用JavaScript嗎?

1. 不再使用var

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

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

2. 沒有for循環(huán)

在學習程序語言的時候,我們一開始就會學到for循環(huán)。但是自從學習了函數(shù)式編程,我將for循環(huán)都改成了使用filter, map和reduce來實現(xiàn)。對于那些需要一些額外計算的需求,我會使用遞歸或則第三方庫比如lazy.js。

如今我的代碼里面完全沒有for循環(huán)了,如果你看到了,告訴我我會把它消除。

3. if也可以被簡化

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

如今我的代碼里面幾乎沒有if語句。為了方便其他開發(fā)者理解我的代碼,我很少使用它。

4. 和switch說拜拜

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

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

5. 不在擔心this

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

函數(shù)式的JavaScript可以讓你完全拋棄使用煩人的this
現(xiàn)在只有數(shù)據(jù)和函數(shù),甚至數(shù)據(jù)不過是函數(shù)的一種特殊表達形式,你再也不需要this了。我開始將對象理解為函數(shù)式語言中狀態(tài)(state)和函數(shù)。我甚至不需要把狀態(tài)或則函數(shù)和對象綁定到一起,就像OOP中那樣。

面向對象的設計不是必須的

現(xiàn)在往回看,我發(fā)現(xiàn)面型對象編程帶來的復雜度真的是不必要的。我可以使用函數(shù)式語言實現(xiàn)同樣的功能,完成相同的任務。而且,代碼更加輕簡,因為不在需要將這些復雜的對象傳來傳去。只有數(shù)據(jù)和函數(shù),而且因為函數(shù)沒有和對象綁定,更加容易復用。我不在需要擔心傳統(tǒng)的原型繼承帶來的所有的問題,JavaScript設計的并不好。

JavaScript缺乏私有、公有、內部或則被保護這類訪問控制器也不再是一個問題。訪問控制器是用來解決由于引入面向對象編程而設計的。在函數(shù)式的JavaScript中,這些問題不復存在。

總結

我的代碼現(xiàn)在看上去完全不同。它包含了很多純函數(shù),我將它們做成不同的ES6模塊。這些函數(shù)可以被使用來構建更加復雜的函數(shù)。很大一部分函數(shù)都是很簡單的一行l(wèi)ambda表達式。

現(xiàn)在我看待軟件的思維也變了:輸入是一個數(shù)據(jù)流,然后程序作用到該數(shù)據(jù)流上對數(shù)據(jù)進行各種操作,然后返回新的數(shù)據(jù)。

函數(shù)式設計對程序語言的影響以及無處不在,C#中的LINQ就是一個最佳的例子。同樣Java 8也引入了函數(shù)式語言的特性。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • IONIC自定義subheader的最佳解決方案

    IONIC自定義subheader的最佳解決方案

    本文重點給大家介紹IONIC自定義subheader的最佳解決方案,本文實例講解,介紹的非常詳細,感興趣的朋友一起看看吧
    2016-09-09
  • JavaScript原始值與包裝對象的詳細介紹

    JavaScript原始值與包裝對象的詳細介紹

    這篇文章主要給大家介紹了關于JavaScript原始值與包裝對象的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • js 使FORM表單的所有元素不可編輯的示例代碼

    js 使FORM表單的所有元素不可編輯的示例代碼

    使FORM表單的的所有元素不可編輯的方法有很多,在本文將為大家詳細介紹下,js是如何做到的,感興趣的朋友不要錯過
    2013-10-10
  • 基于javascript實現(xiàn)的購物商城商品倒計時實例

    基于javascript實現(xiàn)的購物商城商品倒計時實例

    本文主要介紹了基于javascript實現(xiàn)的購物商城商品倒計時實例,代碼詳細,可直接復制試試看效果。需要的朋友可以參考借鑒
    2016-12-12
  • IE view-source 無法查看看源碼 JavaScript看網(wǎng)頁源碼

    IE view-source 無法查看看源碼 JavaScript看網(wǎng)頁源碼

    查看網(wǎng)頁源代碼的方法其實有好幾種,最常用的我們就是在瀏覽器中直接選擇“查看網(wǎng)頁源代碼”就可以了,但是在有些時候這種方法卻不能見效,以下再介紹幾種簡單的方法供大家參考!
    2009-07-07
  • js或者jquery判斷圖片是否加載完成實現(xiàn)代碼

    js或者jquery判斷圖片是否加載完成實現(xiàn)代碼

    需要獲得圖片的寬度和高度,有些js或者jquery代碼在還沒有加載完圖片時就執(zhí)行了,這個問題該怎么解決呢?接下來分別介紹下js與jquery提供的方法
    2013-03-03
  • javascript實現(xiàn)前端分頁功能

    javascript實現(xiàn)前端分頁功能

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)前端分頁功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • div層的移動及性能優(yōu)化

    div層的移動及性能優(yōu)化

    層的移動本來很簡單,用jquery插件或者自己寫一個也不難,但是最近一個ipad項目里,發(fā)現(xiàn)用手移動div會感覺很卡,體驗很差(可能是ipad的配置根不上pc)。
    2010-11-11
  • canvas實現(xiàn)圖像布局填充功能

    canvas實現(xiàn)圖像布局填充功能

    這篇文章主要為大家詳細介紹了canvas實現(xiàn)圖像布局填充功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Javascript 實現(xiàn)復制(Copy)動作方法大全

    Javascript 實現(xiàn)復制(Copy)動作方法大全

    現(xiàn)在瀏覽器種類也越來越多,諸如 IE、Firefox、Chrome、Safari等等,因此現(xiàn)在要實現(xiàn)一個js復制內容到剪貼板的小功能就不是一件那么容易的事了。
    2014-06-06

最新評論

拜泉县| 成武县| 田阳县| 察雅县| 浦东新区| 鹿邑县| 揭东县| 安远县| 余姚市| 左权县| 福海县| 永平县| 茶陵县| 微山县| 南和县| 汶川县| 华容县| 孝义市| 克山县| 密云县| 宜章县| 衡阳县| 武义县| 兴义市| 固始县| 科技| 延长县| 宁陕县| 马山县| 连山| 天等县| 朝阳市| 卢氏县| 岗巴县| 象山县| 宣汉县| 图片| 云霄县| 华宁县| 西丰县| 固安县|