成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS基礎(chǔ)——高階函數(shù)

doodlewind / 1034人閱讀

摘要:定義高階函數(shù)是至少滿足下面一個條件的函數(shù)接收一個或多個函數(shù)作為參數(shù)。當然我們也可以通過高階函數(shù)來自己實現(xiàn)我們可以通過封裝高階函數(shù)來復(fù)用和簡化我們的代碼。

定義

高階函數(shù)是至少滿足下面一個條件的函數(shù):
1、接收一個或多個函數(shù)作為參數(shù)。比如filter函數(shù)
2、返回一個函數(shù)。 比如bind函數(shù)
舉個例子:比如我們要篩數(shù)組[1,2,3,4,5]中大于3的所有元素,我們通常的實現(xiàn)方法為:

let newArr = [];
for(let i = 0,len = arr.length; i < len; i++){
    arr[i] > 3 && newArr.push(arr[i])
}

而使用數(shù)組filter方法的話,只需要 let newArr = arr.filter((item) => {return item > 3})。當然我們也可以通過高階函數(shù)來自己實現(xiàn):

Array.prototype.myFilter = function (fn){
    let newArr = [];
    for(let i = 0,len = this.length; i < len; i++){
        fn(this[i]) && newArr.push(this[i])
    }
    return newArr;
}
[1,2,3,4,5].myFilter((item) => { return item > 3})

我們可以通過封裝高階函數(shù)來復(fù)用和簡化我們的代碼。

柯里化

柯里化是將一個多參數(shù)的函數(shù)轉(zhuǎn)換成多個單參數(shù)的函數(shù),這個函數(shù)會返回一個函數(shù)去處理下一個參數(shù)。也就是把fn(a,b,c)轉(zhuǎn)換為newFn(a)(b)(c)這種形象??吕锘R姷膽?yīng)用有:參數(shù)復(fù)用、延遲計算。比如我們有個拼接接口地址的函數(shù):

function getUrl(service,context,api){
    return service + context + api;
}
let loginUrl = getUrl("http://localhost:8080/","auth","/login")  
let logoutUrl = getUrl("http://localhost:8080/","auth","/logout")

每次前兩個參數(shù)的值都是一樣,我們可以柯里化來封裝下來達到參數(shù)復(fù)用:

function curry(fn){
    let args = Array.prototype.slice.call(arguments,1);    
    return function(){
        let innerArgs = Array.prototype.slice.call(arguments);
        let finalArgs = args.concat(innerArgs);
        if(finalArgs.length < fn.length){         //fn.length為函數(shù)的參數(shù)個數(shù)
            return curry.call(this,fn,...finalArgs)
        }else{
            return fn.apply(null,finalArgs)
        }
    }
}
var getAuthUrl = curry(getUrl,"http://localhost:8080/","auth");
let loginUrl = getAuthUrl("/login")
let logoutUrl = getAuthUrl("/logout")
組合函數(shù)

組合函數(shù)類似于管道,多個函數(shù)的執(zhí)行時,上一個函數(shù)的返回值會自動傳入到第二個參數(shù)繼續(xù)執(zhí)行。比如我們替換一個url中的參數(shù):

function replaceToken(str){
    return str.replace(/{token}/g,"123455")
}
function replaceAccount(str){
    return str.replace(/{account}/g,"xuriliang")
}
replaceAccount(replaceToken("http://localhost/api/login?token={token}&account={account}"))

我們可以利用這種嵌套的寫法來實現(xiàn),但如果嵌套過多,代碼可讀性就不是很好了。當然我們也可以在一個函數(shù)里分過程實現(xiàn),不過這樣函數(shù)就不符合單一原則了。利用函數(shù)組合我們可以這樣寫:

function compose() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
        var i = start;
        var result = args[start].apply(this, arguments);
        while (i--) result = args[i].call(this, result);
        return result;
    }
}
compose(replaceToken,replaceAccount)("http://localhost/api/login?token={token}&account={account}")

組合函數(shù)使得我們可以使用一些通用的函數(shù),組合出各種復(fù)雜運算。這也是函數(shù)編程中pointfree的概念。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102594.html

相關(guān)文章

  • 【重溫基礎(chǔ)】21.高階函數(shù)

    摘要:歡迎您的支持系列目錄復(fù)習資料資料整理個人整理重溫基礎(chǔ)篇重溫基礎(chǔ)對象介紹重溫基礎(chǔ)對象介紹重溫基礎(chǔ)介紹重溫基礎(chǔ)相等性判斷重溫基礎(chǔ)閉包重溫基礎(chǔ)事件本章節(jié)復(fù)習的是中的高階函數(shù),可以提高我們的開發(fā)效率。 本文是 重溫基礎(chǔ) 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】資料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基礎(chǔ)...

    wua_wua2012 評論0 收藏0
  • 【重溫基礎(chǔ)JS中的常用高階函數(shù)介紹

    摘要:也可以直接調(diào)用內(nèi)置方法常用高階函數(shù)方法的作用是接收一個函數(shù)作為參數(shù),對數(shù)組中每個元素按順序調(diào)用一次傳入的函數(shù)并返回結(jié)果,不改變原數(shù)組,返回一個新數(shù)組。 Ps. 晚上加班到快十點,回來趕緊整理整理這篇文章,今天老大給我推薦了一篇文章,我從寫技術(shù)博客中收獲到了什么?- J_Knight_,感受也是很多,自己也需要慢慢養(yǎng)成記錄博客的習慣,即使起步艱難,難以堅持,但還是要讓自己加油加油。 前...

    gitmilk 評論0 收藏0
  • JavaScript設(shè)計模式

    摘要:可能因為先入為主,在編程之中,往往不由自主地以的邏輯編程思路設(shè)計模式進行開發(fā)。這是原型模式很重要的一條原則。關(guān)于閉包與內(nèi)存泄露的問題,請移步原型模式閉包與高階函數(shù)應(yīng)該可以說是設(shè)計模式的基礎(chǔ)要領(lǐng)吧。在下一章,再分享一下的幾種常用設(shè)計模式。 前 在學習使用Javascript之前,我的程序猿生涯里面僅有接觸的編程語言是C#跟Java——忽略當年在大學補考了N次的C與VB。 從靜態(tài)編程語言,...

    keke 評論0 收藏0
  • JS 利用高階函數(shù)實現(xiàn)函數(shù)緩存(備忘模式)

    摘要:所以這里可以利用高階函數(shù)的思想來實現(xiàn)一個簡單的緩存,我可以在函數(shù)內(nèi)部用一個對象存儲輸入的參數(shù),如果下次再輸入相同的參數(shù),那就比較一下對象的屬性,把值從這個對象里面取出來。 1. 高階函數(shù) 高階函數(shù)就是那種輸入?yún)?shù)里面有一個或者多個函數(shù),輸出也是函數(shù)的函數(shù),這個在js里面主要是利用閉包實現(xiàn)的,最簡單的就是經(jīng)??吹降脑谝粋€函數(shù)內(nèi)部輸出另一個函數(shù),比如 var test = function...

    hightopo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<