js函數式編程概念(js是函數式編程語言嗎)

本文目錄一覽:

js 是更傾向於函數式編程了還是更傾向於面向對象

js 是更傾向於函數式編程,js是弱類型語言,也可以叫解釋型語言,開始創建js時傾向於函數式編程。隨著js的發展,加入了面向對象的東西,但它是函數式編程。

JS函數式編程和遞歸探索:路由樹的操作

開始切入正題之前,有必要告知大家一下,這篇文章可能有一些深度,初學者可能理解會有些吃力。我會盡量把複雜問題簡單化,爭取讓每個閱讀的童鞋們都能看得懂。希望你對element-ui,vue-router,KeepAlive組件有一點了解。現在,我們開始吧。

熟悉element-ui的童鞋們都知道,ElMenuItem和ElSubMenu都需要一個index屬性,該屬性必須是唯一的。現在,我們想把路由配置直接應用於ElMenu,該如何確保index的唯一性呢?我們需要有一個生成唯一index的函數。如下是genKey函數的定義,是不是很簡單?

現在,我們創建addRouteMetaKey函數,該函數對路由樹進行遞歸遍歷,為每一個路由配置的meta屬性動態添加key欄位。這個函數很簡單,屬於最基礎的遞歸使用例子,我就不做太多解釋了。

提示 :數組的forEach方法不是純函數,因為它有副作用,所以forEach方法不能稱之為函數式編程工具。

通過addRouteMetaKey函數,我們可以把路由的meta.key作為index的值了。

現在,我們想實現另一個功能,就是 基於標籤頁的路由組件緩存控制 。使用過Vuejs KeepAlive組件的童鞋們,應該多多少少都遇到一些坑吧?在我們的項目中,有一個頂部標籤頁導航,每個tab項對應一個url,以每個url對應路由的title作為tab項標題,當切換tab的時候載入緩存中的url對應的路由組件,關閉tab項,下次打開該路由url,重新掛載對應的路由組件,而不是從緩存中載入。

當路由層級不確定的時候,KeepAlive會變的難以手動控制。所以,我 劍走偏鋒,嘗試了一種簡單的解決方案 ,實踐證明: 這是非常有效的 。我的方案就是把無限層級的路由樹轉化為一維數組。通過為meta添加必要的欄位,進行頁面結構個性化定製。

我們需要把每層路由配置的path轉化為全路徑,所以需要一個函數:getRouteFullPath,該函數定義如下:

getRouteFullPath函數中使用到的joinPath函數用於將多個路徑字元串拼接為1個完整的路徑,定義如下:

現在,我們把路由樹轉化為一維數組。我們定義toFlatRoutes函數,該函數使用了數組的reduce方法對路由樹進行聚合遞歸,將路由配置中的path屬性的值替換為全路徑,還順便給路由配置添加了name屬性,返回一個新的一維路由配置數組。 這是函數式編程和遞歸結合的一個例子。

以上,我們解決了KeepAlive的緩存控制問題;現在,我們又有了一個新的用戶體驗上的需求,就是我們想根據url對應的路由,自動展開該路由meta.key所屬的側邊菜單;我們通過查閱element-ui文檔得知,ElMenu有一個open方法,接收index作為參數,展開index對應的菜單。

現在的問題是,我們的路由對應的index是ElMenuItem的,而路由樹已經被我們轉化為了一維數組,通過路由的matched欄位是得不到我們想要的菜單index的。所以, 我們需要遍歷原始路由樹 。

如下代碼,我們定義getMenuKey函數,該函數接收的參數為route對象。如果路由存在,我們進行查找。首先進行簡單查找,如果找到一個菜單menu,則返回該菜單的meta.key;如果簡單查找無果,則對路由樹進行遞歸查找; 這是函數式編程和遞歸結合的另一個例子。

現在,我們大功告成了;以上就是本節的知識點,童鞋們理解了嗎?只要我們熟悉遞歸的使用,其實操作樹很簡單。如果大家還有不懂的,可以評論區問我。感謝閱讀!

js 什麼是函數式編程

寫一個函數(即方法:function),然後去調用這個方法、比如寫個C的helloworld然後調用printf就是函數式(過程化)編程,

補充:JavaScript一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,最早是在HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。

在1995年時,由Netscape公司的Brendan Eich,在網景導航者瀏覽器上首次設計實現而成。因為Netscape與Sun合作,Netscape管理層希望它外觀看起來像Java,因此取名為JavaScript。但實際上它的語法風格與Self及Scheme較為接近。

前端必學-函數式編程(六)

我們前篇談了很多關於【閉包】的理解了,所以你應該會知道,我們現在將要談的就是 ——【非同步】。

我們為什麼覺得「非同步問題」複雜呢?

其中很重要的一個原因是 —— 時間!時間將我們對數據的操作、管理,變複雜了好幾個量級!

(需要特別提出並明確的是: 非同步和同步之間是可以相互轉化的! 我們使用非同步或者同步取決於 —— 如何使代碼更加可讀!)

函數式編程給出了實現「代碼更可讀」的落地原則(已多次回顧):

所以我們可以期待,非同步在函數式編程中的表現!

上代碼:

onCustomer(..) 和 onOrders(..) 是兩個【回調函數】釋義,兩者執行的先後順序並不能確定,所以它是一個基於時間的複雜狀態。

釋義:回調函數其實就是一個參數,將這個函數作為參數傳到另一個函數裡面,當那個函數執行完之後,再執行傳進去的這個函數。

通常來說,我們最先想到的是:把 lookupOrders(..) 寫到 onCustomer(..) 裡面,那我們就可以確認 onOrders(..) 會在 onCustomer(..) 之後運行。

這樣寫,對嗎?

不對!因為 onCustomer(..) 、 onOrders(..) 這兩個回調函數的關係更像是一種競爭關係(都是賦值 customer.orders ), 它們應該並行執行 , 而不是串列執行 。

即:我不管你們誰先執行,誰先執行完,誰就賦值給 customer.orders !

那我們的思路應該是:

不過,這樣讓代碼又變得更加難閱讀!!函數內部賦值依賴於外部變數、甚至受外部回調函數的影響。

那究竟怎麼辦呢?

最終,我們借用 JS promise 減少這個時間狀態,將非同步轉成同步:

兩個 .then(..) 運行之前, lookupCustomer(..) 和 lookupOrders(..) 已被同步調用,滿足並行執行,誰先結束,誰賦值給 customer.orders ,所以我們不需要知道誰先誰後!

在這樣的實現下,不再需要時間先後的概念!減少了時間狀態!!代碼的可讀性更高了!!

這是一個 積極的數組 ,因為它們同步(即時)地操作著離散的即時值或值的列表/結構上的值。

什麼意思?

a 映射到 b,再去修改 a ,b 不會收到影響。

而這,是一個 惰性的數組 , mapLazy(..) 本質上 「監聽」 了數組 a,只要一個新的值添加到數組的末端(push(..)),它都會運行映射函數 v = v * 2 並把改變後的值添加到數組 b 里。

什麼意思?

a 映射到 b,再去修改 a ,b 也會修改。

原來,後者存在 非同步 的概念。

讓我們來想像這樣一個數組,它不只是簡單地獲得值,它還是一個懶惰地接受和響應(也就是「反應」)值的數組,比如:

設置「懶惰的數組」 a 的過程是非同步的!

b ,是 map 映射後的數組,但更重要的是,b 是 反應性 的,我們對 b 加了一個類似監聽器的東西。

這裡直接給出解答:

這裡再多小結一句:時間讓非同步更加複雜,函數式編程在非同步下的運用就是減少或直接幹掉時間狀態。

想像下 a 還可以被綁定上一些其他的事件上,比如說用戶的滑鼠點擊事件和鍵盤按鍵事件,服務端來的 websocket 消息等。

上述的 LazyArray 又可叫做 observable !(當然,它不止用在 map 方法中)

現在已經有各種各樣的 Observables 的庫類,最出名的是 RxJS 和 Most 。

以 RxJS 為例:

不僅如此,RxJS 還定義了超過 100 個可以在有新值添加時才觸發的方法。就像數組一樣。每個 Observable 的方法都會返回一個新的 Observable,意味著他們是鏈式的。如果一個方法被調用,則它的返回值應該由輸入的 Observable 去返回,然後觸發到輸出的 Observable里,否則拋棄。

比如:

本篇介紹了【非同步】在函數式編程中的表現。

原則是:對於那些非同步中有時態的操作,基礎的函數式編程原理就是將它們變為無時態的應用。即 減少時間狀態 !

就像 promise 創建了一個單一的未來值,我們可以創建一個積極的列表的值來代替像惰性的observable(事件)流的值。

我們介紹了 RxJS 庫,後續我們還會介紹更多優美的 JS 函數式編程庫!

(俗話說的好,三方庫選的好,下班都很早!!)

現在本瓜有點明白那句話了:看一門語言是不是函數式編程,取決於它的核心庫是不是函數式編程。

也許我們還不熟悉像 RxJS 這類庫,但我們慢慢就會越來越重視它們,越來越使用它們,越來越領會到它們!!

非同步,以上。

js函數式編程思想就是運算不改變值只是新建值嗎?

你好,你可以這樣理解,函數式編程它不修改狀態,因此函數式編程只是返回新的值,不修改系統變數。函數式編程思想是把運算過程盡量寫成一系列嵌套的函數調用。

它主要是通過閉包和高階函數等來進行編程,屬於面向過程編程,強調通過函數,而不是語句來編程。

求科普什麼是函數式編程語言

實際上,函數式編程沒有一個嚴格的官方定義。嚴格上來講,函數式編程中的「函數」,並不是指我們編程語言中的「函數」概念,而是指數學「函數」或者「表達式」(例如:y=f(x))。不過,在編程實現的時候,對於數學「函數」或「表達式」,我們一般習慣性地將它們設計成函數。所以,如果不深究的話,函數式編程中的「函數」也可以理解為編程語言中的「函數」。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245415.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:09
下一篇 2024-12-12 13:09

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論