国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript函數柯里化的簡單實現

187J3X1 / 2164人閱讀

摘要:簡單來說,柯里函數就是只接受一個參數的函數,柯里化的起源請參看這篇文章函數式編程入門教程通常來講,如果三個數求和的函數我們會這樣寫如果只考慮實現這個函數的柯里化,我們可以這樣做觀察上面兩種不同的寫法可以發現,第二種寫法其實就是首先把三個參數

簡單來說,柯里函數就是只接受一個參數的函數,柯里化的起源請參看這篇文章:函數式編程入門教程
通常來講,如果三個數求和的函數我們會這樣寫:

function _sum3(x, y, z) {
    return x + y + z
}

如果只考慮實現這個函數的柯里化,我們可以這樣做:

function sum3(x) {
    return function(y) {
        return function(z) {
            return x + y + z
        }
    }
}
console.log(sum3(1)(2)(3)) // 6

觀察上面兩種不同的寫法可以發現,第二種寫法其實就是首先把三個參數收集起來,然后到最后再調用第一種寫法的函數:

function sum3(x) {
    return function(y) {
        return function(z) {
            return _sum3(x, y, z)
        }
    }
}
console.log(sum3(1)(2)(3)) // 6

所以柯里化的寫法只是把常用寫法包裝了一下,可以使用一個專用的柯里化函數實現這種包裝。柯里化函數是一種高階函數,我們把它命名為curry

function curry(fn) {
    return function(y) {
        return function(z) {
            return fn(x, y, z)
        }
    }
}
var sum3 = curry((x, y, z) => {
    return x + y + z
})
console.log(sum3(1)(2)(3)) // 6

如果有要寫一種更加通用的,可以柯里化擁有任意多個參數的函數呢,比如sumN(1)(2)(3)...(N),按照之前的寫法,大概是這個樣子的:

function curryN(fn) {
    return function(a1) {
        return function(a2) {
            return function(a3) {
                //......
                return function(aN) {
                    return fn(a1, a2, a3, ...aN)
                }
            }
        }
    }
}

很容易想到可以用一個遞歸函數來簡化這種寫法,將上面那些看起來相似的函數結構命名為nest,就可以寫為:

function nest(fn) {
    return function(x) {
        return nest(fn)
    }
}
function curry(fn) {
    nest(fn)
}

這里缺少一個循環終止的判斷,所以nest函數先引入一個新參數i,當i === N時遞歸終止

function nest(fn, i) {
    return function(x) {
        if (i === N) {
            return fn(...)
        }
        return nest(fn, i + 1)
    }
}
function curry(fn) {
    return nest(fn, 1)
}   

接著,需要一個存放任意多個參數的數組,將這個數組命名為args,然后傳入nest函數

function nest(fn, i, args) {
    return function(x) {
        args.push(x)
        if (i === fn.length) {
            return fn(...args)
        }
        return nest(fn, i + 1, args)
    }
}
function curry(fn) {
    const args = []
    return nest(fn, 1, args)
}

最后在添加一個處理0個參數的情況,我們就完成了最終版的柯里化函數

function curry(fn) {
    if (fn.length === 0) {
        return fn
    }
    const args = []
    return nest(fn, 1, args)
}

測試一下,在線demo:

const log1 = curry((x) => console.log(x))
log1(10) // 10
const mul3 = curry((x, y, z) => console.log(x*y*z))
mul3(2)(3)(4) // 24
參考文章

Currying in JS
Currying in JavaScript ES6

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94318.html

相關文章

  • JavaScript函數式編程,真香之組合(一)

    摘要:組合的概念是非常直觀的,并不是函數式編程獨有的,在我們生活中或者前端開發中處處可見。其實我們函數式編程里面的組合也是類似,函數組合就是一種將已被分解的簡單任務組織成復雜的整體過程。在函數式編程的世界中,有這樣一種很流行的編程風格。 JavaScript函數式編程,真香之認識函數式編程(一) 該系列文章不是針對前端新手,需要有一定的編程經驗,而且了解 JavaScript 里面作用域,閉...

    mengbo 評論0 收藏0
  • 掌握JavaScript函數柯里

    摘要:原文鏈接和都支持函數的柯里化函數的柯里化還與的函數編程有很大的聯系如果你感興趣的話可以在這些方面多下功夫了解相信收獲一定很多看本篇文章需要知道的一些知識點函數部分的閉包高階函數不完全函數文章后面有對這些知識的簡單解釋大家可以看看什么是柯里化 原文鏈接 Haskell和scala都支持函數的柯里化,JavaScript函數的柯里化還與JavaScript的函數編程有很大的聯系,如果你感興...

    DTeam 評論0 收藏0
  • 高階函數應用 —— 柯里化與反柯里

    摘要:柯里化通用式上面的柯里化函數沒涉及到高階函數,也不具備通用性,無法轉換形參個數任意或未知的函數,我們接下來封裝一個通用的柯里化轉換函數,可以將任意函數轉換成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 閱讀原文 前言 在 JavaScript 中,柯里化和反柯里化是高階函數的一種應用,在這之前...

    wyk1184 評論0 收藏0
  • 柯里化的理解和實現

    摘要:閱讀學習專題之函數柯里化函數式編程指南對柯里化的理解很多人對于柯里化的理解僅僅停留在復用參數上。使用柯里化的場景想要實現某個操作邏輯。換句話說,柯里化將輸入的函數和參數進行綁定,返回綁定后的函數,返回的函數期待剩余的參數。 閱讀學習 JavaScript專題之函數柯里化JS 函數式編程指南 對柯里化的理解 很多人對于柯里化的理解僅僅停留在復用參數上。但我認為函數式編程思想更重要作用的是...

    hsluoyz 評論0 收藏0
  • 「前端面試題系列6」理解函數柯里

    摘要:原題如下寫一個方法,當使用下面的語法調用時,能正常工作這道題要考察的,就是對函數柯里化的理解。當參數只有一個的時候,進行柯里化的處理。這其實就是函數柯里化的簡單應用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 這是前端面試題系列的第 6 篇,你可能錯過了前面的篇章,可以在這里找到: ES6 中箭頭函數的...

    liaorio 評論0 收藏0

發表評論

0條評論

187J3X1

|高級講師

TA的文章

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