zoukankan      html  css  js  c++  java
  • 实现add(1)(2)(3)-利用toString和函数柯里化

    // 利用了会自动调用toString方法
    // 具体和valueOf了解可以看https://blog.csdn.net/FE_dev/article/details/77151434
    function add(m) {
      var temp = function(n) {
        return add(m + n);
      }
    
      temp.toString = function() {
        return m;
      }
    
      return temp;
    }
    add(1)(2)(3); // 6
    

      



    // 这句话道出了精髓:用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数。 // 引用:https://github.com/mqyqingfeng/Blog/issues/42 var curry = function(fn) { // 获取非fn参数数组 var args = [].slice.call(arguments, 1); return function() { var allArgs = [...args, ...[].slice.call(arguments)]; return fn.apply(this, allArgs); } } // 指定固定的参数 function add(a, b) { console.log(a + b); return a + b; } var addCurry = curry(add, 1, 2); addCurry(); // 1 + 2 var addCurry = curry(add, 1); addCurry(2); // 1 + 2 var addCurry = curry(add); addCurry(1, 2); // 1 + 2 addCurry(1)(2); // 但是还没有达到具体的预期,我们要实现多个参数函数转换一系列使用单个参数的函数 var sub_curry = function(fn) { // 获取非fn参数数组 var args = [].slice.call(arguments, 1); return function() { var allArgs = [...args, ...[].slice.call(arguments)]; return fn.apply(this, allArgs); } } var curry = function(fn, length) { // 获取函数的参数个数 var len = length || fn.length; return function() { var args = [].slice.call(arguments); // 如果参数的数量匹配函数的参数,即执行函数 if (args.length === len) { return fn.apply(this, args); } else { // 参数的数量和匹配函数的数量不匹配时,挤破脑袋想怎么把(1, 2)(3)凑成(1, 2, 3) // (1, 2)(3)凑成(1, 2, 3)也就时如上第一版,这里取名为sub_curry var combined = [fn].concat([].slice.call(arguments)); // combined就如同上面的arguments return curry(sub_curry.apply(this, combined), len - arguments.length); // } } } var addCurry = curry(function(a, b, c) { console.log(a + b + c); return a + b + c; }); addCurry(1, 2, 3); // 6 addCurry(1, 2)(3); // 6 addCurry(1)(2)(3); // 6 addCurry(1)(2, 3); // 6

      

  • 相关阅读:
    数学工具WZgrapher
    零线和地线的区别,示波器如何测量市电?
    使用直流稳压电源时的注意事项!
    中文全角和半角输入有什么区别?
    ThinkingRock:使用方法
    2014记首
    如何使用Excel绘制甘特图
    AStyle代码格式工具在source insight中的使用
    STM32F103系列命名规则
    上市公司行情查询站点
  • 原文地址:https://www.cnblogs.com/chenfengami/p/12705514.html
Copyright © 2011-2022 走看看