zoukankan      html  css  js  c++  java
  • js 柯里化

    // 普通的add函数
    function add(x, y) {
        return x + y
    }
    
    // Currying后
    function curryingAdd(x) {
        return function (y) {
            return x + y
        }
    }
    
    add(1, 2)           // 3
    curryingAdd(1)(2)   // 3

    示例:
    1. 参数复用
    // 正常正则验证字符串 reg.test(txt)
    
    // 函数封装后
    function check(reg, txt) {
        return reg.test(txt)
    }
    
    check(/d+/g, 'test')       //false
    check(/[a-z]+/g, 'test')    //true
    
    // Currying后
    function curryingCheck(reg) {
        return function(txt) {
            return reg.test(txt)
        }
    }
    
    var hasNumber = curryingCheck(/d+/g)
    var hasLetter = curryingCheck(/[a-z]+/g)
    
    hasNumber('test1')      // true
    hasNumber('testtest')   // false
    hasLetter('21212')      // false


    // 支持多参数传递  ---通用写法
    function progressCurrying(fn, args) {
    
        var _this = this
        var len = fn.length;
        var args = args || [];
    
        return function() {
            var _args = Array.prototype.slice.call(arguments);
            Array.prototype.push.apply(args, _args);
    
            // 如果参数个数小于最初的fn.length,则递归调用,继续收集参数
            if (_args.length < len) {
                return progressCurrying.call(_this, fn, _args);
            }
    
            // 参数收集完毕,则执行fn
            return fn.apply(this, _args);
        }
    }

    curry的性能

    curry的一些性能问题你只要知道下面四点就差不多了:

    • 存取arguments对象通常要比存取命名参数要慢一点
    • 一些老版本的浏览器在arguments.length的实现上是相当慢的
    • 使用fn.apply( … ) 和 fn.call( … )通常比直接调用fn( … ) 稍微慢点
    • 创建大量嵌套作用域和闭包函数会带来花销,无论是在内存还是速度上

    最后再扩展一道经典面试题

    // 实现一个add方法,使计算结果能够满足如下预期:
    add(1)(2)(3) = 6;
    add(1, 2, 3)(4) = 10;
    add(1)(2)(3)(4)(5) = 15;
    
    function add() {
        // 第一次执行时,定义一个数组专门用来存储所有的参数
        var _args = Array.prototype.slice.call(arguments);
    
        // 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
        var _adder = function() {
            _args.push(...arguments);
            return _adder;
        };
    
        // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
        _adder.toString = function () {
            return _args.reduce(function (a, b) {
                return a + b;
            });
        }
        return _adder;
    }
    
    add(1)(2)(3)                // 6
    add(1, 2, 3)(4)             // 10
    add(1)(2)(3)(4)(5)          // 15
    add(2, 6)(1)                // 9


    作者:flowsands
    链接:https://www.jianshu.com/p/2975c25e4d71
    来源:简书

     
  • 相关阅读:
    Python爬虫爬取糗事百科段子内容
    Python 的安装与配置(Windows)
    接口测试(二)—HttpClient
    接口测试(一)
    第一篇 什么是软件测试
    Python数据分析与挖掘第一篇—基本介绍及环境搭建
    从零开始搭建简易的异步非阻塞web框架
    Python多线程补充—GIL
    Python并发之多进程
    Python并发之多线程
  • 原文地址:https://www.cnblogs.com/trend/p/10711322.html
Copyright © 2011-2022 走看看