函數柯里化常見應用---add(1,2) add(1)(2) add(1)(2)(3) add(1,2,3)(4)


這是一道經典的題目,先上代碼:

解法1:

function add () {
  var args = Array.prototype.slice.call(arguments);

  var fn = function () {
    var sub_arg = Array.prototype.slice.call(arguments);
   // 把全部的參數聚集到參數的入口為一個參數: args.concat(sub_arg) return add.apply(null, args.concat(sub_arg)); } fn.valueOf = function () { return args.reduce(function(a, b) { return a + b; }) } return fn; } console.log(add(1,2)) // 3 console.log(add(1)(2)) // 3 console.log(add(1)(2)(3)) // 6 console.log(add(1,2,3)(4)) // 10

解法2:

    function add () {
      var args = Array.prototype.slice.call(arguments);

      var fn = function () {
     // 把參數都放在一個相當於全局變量的 args 里面  args.push(...arguments) return fn; } fn.valueOf = function () { return args.reduce(function(a, b) { return a + b; }) } return fn; } console.log(add(1,2)) // 3 console.log(add(1)(2)) // 3 console.log(add(1)(2)(3)) // 6 console.log(add(1,2,3)(4)) // 10

 

解題的關鍵技術點如下

一. 函數柯里化

 柯里化定義:

      是把接受多個參數的函數變換成接受一個單一參數的函數,並且返回接受余下的參數而且返回結果是新函數的技術。

對定義的解釋:

 對比下平常的函數,都是返回一個結果(具體的值),而柯里化的函數是可以接收多個參數比如 "(1)(2)",並且返回的是一個新的函數(比如代碼里的 fn ),而且這個新函數接收剩下的參數。

二. 自定義修改 valueOf 方法

valueOf簡單來說,就是在console.log(add(1))的時候,會自動調用valueOf方法,我們把它重寫了, 調用的時候,就把 args 這個數組求和返回就是最終結果了。

valueOf的具體講解看這里 https://blog.csdn.net/dapangzi88/article/details/61197937#   講的很好。

 

參考: https://www.jianshu.com/p/2975c25e4d71      https://blog.csdn.net/dapangzi88/article/details/61197937#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM