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

資訊專欄INFORMATION COLUMN

Javascript currying柯里化詳解

mengbo / 1110人閱讀

摘要:面試題實現結果,題的核心就是問的的柯里化先說說什么是柯里化,看過許多關于柯里化的文章,始終搞不太清楚,例如柯里化是把接受多個參數的函數變換成接受一個單一參數最初函數的第一個參數的函數,并且返回接受余下的參數且返回結果的新函數的技術。

面試題:實現add(1)(2)(3) //結果 = 6,題的核心就是問的js的柯里化

先說說什么是柯里化,看過許多關于柯里化的文章,始終搞不太清楚,例如:柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數且返回結果的新函數的技術。大多數的blog都是這種說法,說實話我是懵逼的。
我的理解是,curry是一個收集參數的方法,收集夠了去執行函數。

實現前我們先列一下要點
1、收集參數(就像面試題多次執行多個參數)是的利用閉包
2、每次執行參數有多有少例如add(1)(2,3)(4)
3、我們需要知道什么時候參數夠了

        //如題
        //add(1)(2)(3)
        //邏輯應該是這樣add(1)執行收集參數1繼續執行收集參數2依次類推直到收集完畢。
       function curry(fn) {
            let arg = []; //用于收集參數
            //做一個閉包https://segmentfault.com/a/1190000017824877
            return function() {
                //每執行一次收集一次參數,為什么用concat是因為有時候后是多個參數(2,3)
                arg = arg.concat([...arguments]);
                //直到參數收集完成執行fn
                // 我們需要知道什么時候收集完了,條件就是curry參數fn的參數個數 fn.length
                //如果收集的參數個數大于等于fn的參數個數執行fn,如果沒有遞歸執行
                if (arg.length >= fn.length) {
                    return fn(...arg)
                }
                // 參數沒有收集完我們需要繼續收集,遞歸
                return arguments.callee
            }
        }

        // 測試一下
        let testAdd = curry(add1)
        // console.log(testAdd(1)(2)(3))
        // console.log(testAdd(1, 2)(3))
        //console.log(testAdd(1)(2, 3))

一不小心寫完了!

不過不能標題黨,說好的詳解,接下來我們解析一下網上大多數柯里化的實現代碼

function curry(fn) {
  function _c(restNum, argsList) {
    return restNum === 0 ?
      fn.apply(null, argsList) :
      function(x) {
        return _c(restNum - 1, argsList.concat(x));
      };
  }
  return _c(fn.length, []);
}

一眼看不明白沒事,我們多看幾眼。
解析:
1、curry也是接收一個參數(fn)這個是必然
2、返回了一個函數,接收兩個參數,fn.length和一個空數組這個好解
釋,我寫的簡版也說過了,fn.length是為了判斷參數是否收集夠
了,參數傳一個空數組其實也是閉包的一種實現,用來收集參數。
3、里邊是一個三目判斷,看著花里胡哨的沒那么復雜,判斷fn的參數個數如果是0,那就沒必要收集了直接執行fn,至于fn.apply(null,argList)我很明白的大聲說出來會用個apply就到處用嗎?在我看來沒有一分錢用,之所以用是因為argList是一個數組,正好apply正好支持第二個參數是數組,主要看起來很牛逼的樣子。
4、收集參數,fn參數個數不為零,每次收集fn函數參數的個數減一,直到等于0執行fn,這個就沒有我寫的通用了,我一次傳倆就掛了。

再來一個例子:bind方法實現

Function.prototype.bind = function(context) {
            //返回一個綁定this的函數,我們需要在此保存this
            let self = this
                // 可以支持柯里化傳參,保存參數
            let arg = [...arguments].slice(1)
                // 返回一個函數
            return function() {
                //同樣因為支持柯里化形式傳參我們需要再次獲取存儲參數
                let newArg = [...arguments]
                console.log(newArg)
                    // 返回函數綁定this,傳入兩次保存的參數
                    //考慮返回函數有返回值做了return
                return self.apply(context, arg.concat(newArg))
            }
        }

        // 搞定測試
        let fn = Person.say.bind(Person1)
        fn()
        fn(18)

是的bind方法就是用的柯里化,bind實現詳情請移步:https://segmentfault.com/a/11...

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

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

相關文章

  • 掌握JavaScript函數的柯里

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

    DTeam 評論0 收藏0
  • 函數式編程之柯里和組合詳解

    摘要:提到函數式編程,就不得不提柯里化和組合。說實話,在之前的項目開發中,對柯里化和組合的運用不是太多,因為不太清楚應該在哪些情況下應該使用它們。所以在這篇文章中,我們將詳細的介紹柯里化和組合的用法以及使用場景。 提到函數式編程,就不得不提柯里化和組合。說實話,在之前的項目開發中,對柯里化和組合的運用不是太多,因為不太清楚應該在哪些情況下應該使用它們。所以在這篇文章中,我們將詳細的介紹柯里化...

    Jonathan Shieber 評論0 收藏0
  • SegmentFault 技術周刊 Vol.16 - 淺入淺出 JavaScript 函數式編程

    摘要:函數式編程,一看這個詞,簡直就是學院派的典范。所以這期周刊,我們就重點引入的函數式編程,淺入淺出,一窺函數式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數式編程就是關于如使用通用的可復用函數進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數式編程(Functional Programming),一...

    csRyan 評論0 收藏0
  • 前端進擊的巨人(五):學會函數柯里(curry)

    摘要:函數柯里化是把支持多個參數的函數變成接收單一參數的函數,并返回一個函數能接收處理剩余參數,而反柯里化就是把參數全部釋放出來。但在一些復雜的業務邏輯封裝中,函數柯里化能夠為我們提供更好的應對方案,讓我們的函數更具自由度和靈活性。 showImg(https://segmentfault.com/img/bVburN1?w=800&h=600); 柯里化(Curring, 以邏輯學家Has...

    chengtao1633 評論0 收藏0
  • 高級函數技巧-函數柯里

    摘要:如果你對函數式編程有一定了解,函數柯里化是不可或缺的,利用函數柯里化,可以在開發中非常優雅的處理復雜邏輯。同樣先看簡單版本的方法,以方法為例,代碼來自高級程序設計加強版實現上面函數,可以換成任何其他函數,經過函數處理,都可以轉成柯里化函數。 我們經常說在Javascript語言中,函數是一等公民,它們本質上是十分簡單和過程化的。可以利用函數,進行一些簡單的數據處理,return 結果,...

    shixinzhang 評論0 收藏0

發表評論

0條評論

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