zoukankan      html  css  js  c++  java
  • JS中的函数柯里化

    1. 概念

    ”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数。

    简单讲:就是利用函数执行,可以形成一个不销毁的私有作用域,把预先处理的内容都存在这个不销毁的作用域里面,

                  并且返回一个函数,以后要执行的就是这个函数。


    举个栗子:

    // 常规的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

    在柯里化后,将函数的一个参数拆分为两个乃至更多参数

    2. 用途

    2.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 hasString = curryingCheck(/[a-z]+/g)
    
    hasNumber('test1')      // true
    hasNumber('testtest')   // false
    hasString('21212')      // false

    对于正则的校验,如果有很多地方都要校验是否有数字,我们只需要将第一个参数reg进行复用,

    这样别的地方就能够直接调用hasNumber,hasString等函数,让参数能够复用。

    2.2 提前返回
    //把isSupport这个参数给先确定下来
    var on = function(element, event, handler) {
        if (document.addEventListener) {
            if (element && event && handler) {
                element.addEventListener(event, handler, false);
            }
        } else {
            if (element && event && handler) {
                element.attachEvent('on' + event, handler);
            }
        }
    }
    
    var on = (function() {
        if (document.addEventListener) {
            return function(element, event, handler) {
                if (element && event && handler) {
                    element.addEventListener(event, handler, false);
                }
            };
        } else {
            return function(element, event, handler) {
                if (element && event && handler) {
                    element.attachEvent('on' + event, handler);
                }
            };
        }
    })();
    
    //后一种方法
    var on = function(isSupport, element, event, handler) {
        isSupport = isSupport || document.addEventListener;
        if (isSupport) {
            return element.addEventListener(event, handler, false);
        } else {
            return element.attachEvent('on' + event, handler);
        }
    }

    后一种方法可以避免每次都进行判断,提前确定了哪一种方法,提前返回。

    2.3 延迟运行

    bind函数实现机制就是柯里化的封装

    Function.prototype.bind = function (context) {
        var _this = this
        var args = Array.prototype.slice.call(arguments, 1)
     
        return function() {
            return _this.apply(context, args)
        }
    }

    延迟执行,在没有输入参数时,不计算总结果。等需要计算的时候,再计算。

    本文引自:https://blog.csdn.net/aaaaa1994/article/details/94359366

  • 相关阅读:
    java实现Floyd算法
    java实现Floyd算法
    java实现Floyd算法
    java实现Floyd算法
    java实现Dijkstra算法
    java实现Dijkstra算法
    java实现Dijkstra算法
    java实现Dijkstra算法
    java实现Dijkstra算法
    QTableWidget简单应用之文件浏览器
  • 原文地址:https://www.cnblogs.com/ggll611928/p/13266576.html
Copyright © 2011-2022 走看看