js函數式編程

来源:https://www.cnblogs.com/czkolve/archive/2019/04/27/10779554.html
-Advertisement-
Play Games

js 函數式編程 定義把函數作為第一類對象是函數式編程的第一步,函數式編程是一種編碼風格,他通過書寫函數式代碼來解決問題(而不是一系列執行步驟,就像 就像那種更主流的命令式編程),函數式編程可以讓代碼更容易測試、擴展、及模塊化 1.函數是javascript中的一等公民,(主要是的某個變數可以等於一 ...


  js 函數式編程

    定義把函數作為第一類對象是函數式編程的第一步,函數式編程是一種編碼風格,他通過書寫函數式代碼來解決問題(而不是一系列執行步驟,就像

    就像那種更主流的命令式編程),函數式編程可以讓代碼更容易測試、擴展、及模塊化

    1.函數是javascript中的一等公民,(主要是的某個變數可以等於一個函數,然後是用變數名加()去調用這個函數)

      1.1構造函數

      1.2普通函數

    1.1函數作為構造函數使用,一般構造函數的首字母大寫,做為構造函數使用,我們就可以使用new去創建那個實力

function Person() {
    this.name = 'cz';
    this.age = 19;
    this.sex = '';
    this.fn = function (val) {
        console.log(val)
    }
}

let p1 = new Person();

console.log(p1.name,p1.age,p1.sex)
p1.fn('a')

    1.2 作為普通函數調用,這個就是最簡單的使用

function speak(val) {
    console.log(val+'wawawahahha');
}
speak('duide')

    

  2幾種常見的函數使用

    2.1 函數作為變數的使用(回調函數,)

function goback(a,b,callback) {
    let c = a + b;
    callback(c)
}
function cc(last) {
    console.log(last)
}
goback(1,2,cc);

    /* 手動實現數組的排序功能 */

Array.prototype.zdysort = function (fn) {
    let len = this.length;
    for(let i = 0;i < len; i++) {
        for(let j = i+1;j < len; j++) {
            let temp = this[i]
            if(fn(this[i],this[j])) {
                this[i] = this [j]
                this[j] = temp
            }
        }
    }
}
/* 升序 */
function sort(a,b) {
    return a>b
}
let arrys = [1,25,3,6,7,9,45,21,35,62,54,21]
arrys.zdysort(sort)
console.log(arrys)
function usort(a,b) {
    return a<b
}
arrys.zdysort(usort)
console.log(arrys)

// (12) [1, 3, 6, 7, 9, 21, 21, 25, 35, 45, 54, 62]
// (12) [62, 54, 45, 35, 25, 21, 21, 9, 7, 6, 3, 1]

    2.2函數柯里化

      維基百科上說道:柯里化,英語:Currying(果然是滿滿的英譯中的既視感),是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數而且返回結果的新函數的技術

    

/* 函數科里化 */

/* 一個簡單的函數柯里化 */

function add (a,b) {
    return a+b;
}
function kadd(a) {
    return function (b) {
        return a+b
    }
}
console.log(add(1,2)) // 3
console.log(kadd(1)(2))  // 3

/* 柯里化 實現函數參數的復用 */

function Istype (type) {
    return function (obj) {
        return typeof(obj) === type
    }
}

let Isnumber = Istype('number')
console.log(Isnumber(1))
console.log(Isnumber('a'))
console.log(Isnumber(4))

let isobject = Istype('object')
console.log(isobject({}))
console.log(isobject('a'))
console.log(isobject(4))
/* 使用函數柯里化實現 函數的bind */

Function.prototype.zdybind = function (content) {
    let self = this
    return function () {
        return self.call(content,arguments)
    }
}

function Animal(){    
    this.name = "Animal";    
    this.showName = function(){    
        console.log(this.name);    
    }    
} 

// Animal.showName();// 報錯 animal is not a function

let a1 = new Animal();
a1.showName() // "Animal"
a1.showName.call({name:'czcz'}) //czcz
/* 使用自定義的bing函數 */
a1.showName.zdybind({name:'czcz'}) // 輸出無
/* bind 相對於 call和apply 需要自己手動調用 */
a1.showName.zdybind({name:'czcz'})() //'czcz'  自定義的zdybind函數就實現了

  函數,不得不提的就是函數上原生就有的三個方法,bind,call,apply,他們都能改變函數的執行作用域(運行時的函數this指向)

  call 和 apply 基本上一樣,就是傳入的第二參數不一樣,一個傳入的參數用,call(self,a,b,c,d) bind(self,[a,b,c,d]) ,而bind和他們的區別就是bind創建後不會立即執行,上面已經實現

 

   函數式編程遠遠都不止這麼一點,上面只是一些平常會經常遇見的問題,函數運行時的執行環境也是非常重要的。直接調用,作為構造函數調用,箭頭函數,apply bing,call,之後的函數作用域

  ,es6 還對函數新增的一些擴展

  3.es6函數的擴展 

    3.1 函數的預設參數問題

function speak(name = 'cz') {
    console.log(`${name} i love you`)
}
speak()
speak('czkjjj')

    3.2參數的解構賦值

    3.3 rest 參數,直接將argument直接轉化成數組

    3.4name 和length屬性, name 代表函數名字, length 代表函數的參數 length 長度不包括rest 參數

    3.5 es6函數最重要的擴展,箭頭函數,(沒有自身this的函數,只想上一級不為箭頭函數的函數)

/* es6箭頭函數 */
/* 數組排序是箭頭函數的使用 */
let arrys = [25,1,34,5,64,15,3,1,7,84,65]
let newarrys = arrys.sort(function(a,b){
    return a - b
})
console.log(newarrys)
/* setTimeout 中的this指向  函數體內的this對象,就是定義時所在的對象 ,而不是運行時的this*/

let obj = {
    a: 'czcz',
    b: 'dddd',
    c: function () {
        setTimeout (function () {
            console.log(this.a)
        },0)
    }
}
obj.c(); // 輸出undefined 這裡內部的函數最終的執行環境 window
/* 改造一下函數 */
obj.d = function () {
    setTimeout(()=>
    {
        console.log(this.a)
    },0)
}
obj.d() // 輸出'czcz' 這裡內部的函數最終的執行環境 obj

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述:本文描述TypeScript環境搭建,以及基於VSCode的自動編譯設置和調試設置。網路上很多相應文章的方式過時了或者無法試驗成功。 TypeScript簡介:由微軟開發的開源免費的編程語言,是JavaScript語言的一個超集,本質上為JavaScript語言添加了可選的靜態類型和基於類的面 ...
  • 前提摘要 尤大大的vue3.0即將到來,雖然學不動了,但是還要學的啊,據說vue3.0是基於proxy來進行對值進行攔截並操作,所以es6的proxy也是要學習一下的。 一 什麼是proxy Proxy 對象用於定義基本操作的自定義行為(如屬性查找,賦值,枚舉,函數調用等) 摘自MDN Proxy ...
  • 關閉jquery-easui tab標簽頁前觸發事件 by:授客 QQ:1033553122 測試環境 jquery-easyui-1.5.3 需求場景 點擊父頁面tab 頁關閉按鈕時,需要做判斷,判斷該tab頁面是否可以關閉:獲取子頁面js中定義的taskStatus,如果taskStatu不為t ...
  • 所謂js的中的傳值,其實也就是說5種基本數據類型(null,undefind,boolean,number,string) 傳引用也就是說的那個引用數據類型,(array和object) 基本數據類型的值不可變,而引用數據類型的值是可變的 所以當你比較數組和對象時,都是false;除非你是克隆的原份 ...
  • JS的基本語法要求 1. 嚴格區分大小寫 2. 標識符命名要求(與java完全相同) 首個字元只能是 字母、下劃線、美元符號 其他位置只能是 字母、下劃線、美元符號、數字 3. 變數的聲明 JavaScript的聲明必須要使用var關鍵字,聲明方式有兩種。 聲明並且賦值:var 變數名 = 值 先聲 ...
  • canvas實現隨機驗證碼 知識點 canvas生成背景圖和文字 設置字體樣式和大小 String的fromCharCode(code碼)生成大小寫字母和數字 str.toLowerCase()轉小寫 隨機抽取不重覆的6位數字組成驗證碼字元串 效果圖 html: css: js: javascrip ...
  • quillJS 富文本編輯器目前是一款很火富文本編輯器,使用廣泛,github 上面的 star 有 22,492,雖然說不以 star 論英雄,不過這可以說明它還是比較受歡迎的; 它的特點是:輕量,易上手,易擴展,開源,所見即所得的一款現代編輯器,還有一點是它的實現思路和其他的編輯器有點不一樣(會 ...
  • 作為一個前端新人,學習了設計模式以後,希望能從源頭上,用淺顯易懂的語言來解釋它。當然不一定是正確的,只是我個人對設計模式的一點淺顯理解。 創建型設計模式 創建型設計模式:故名思意,這些模式都是用來創建實例對象的。 單例模式:首先我們需要理解什麼是單例。單:指的是一個。例:指的是創建的實例。單例:指的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...