柯里化

作者: BingeryLamb | 来源:发表于2020-01-15 16:11 被阅读0次

ES6实现

function curry (fn) {
    const ctx = this
    function inner (...args) {
        if(args.length === fn.length) return fn.call(ctx, ...args)
        return (...innerags) => {
            return inner.call(ctx, ...args, ...innerags)
        }
    }
    return inner
}
var add = function(a,b,c){
    console.log(a+ b + c)
}
var f = curry(add)
f(1,2)(2)

柯里化

function curry (fn, currArgs) {
    //fn 最初的函数sum
    //arguments [fn, currArgs]
    //currArgs 闭包保存currArgs 首次没有
    return function() {
        let args = [].slice.call(arguments)
        //args, arguments 返回函数传入的新参数
        if (currArgs !== undefined) {
            args = args.concat(currArgs)
            //之前有arg的合上
        }
        // 递归调用
        if (args.length < fn.length) {
            //传入当前所有参数args递归
            //args与currArgs一致呼应
            return curry(fn, args)
        }
        //参数达到要求sum要求了执行
        return fn.apply(null, args)
    }
}

function sum(a, b, c) {
    console.log(a + b + c)
}
const fn = curry(sum)

fn(1, 2)

在一个函数中首先填充几个参数,然后再返回一个新函数的技术称为柯里化(Currying)。

两个变量的函数y,x,固定了y=2,则得到一个变量的函数2,x。部分求值策略。

柯里化(Currying)具有:延迟计算、参数复用、动态生成函数的作用。

柯里化的应用

柯里化不同于的闭包在于柯里化返回的函数还带有参数

事件监听

每调用一次函数都需要重新进行判断

var addEvent = function(ele, type, fn){
    if(window.addEventListener){
        ele.addEventListener(type, fn)
    } else if(window.attachEvent){
        ele.attachEvent('on' + type, fn)
    }
}

让判断只执行一次

var addEvent = (function(){
    if(window.addEventListener){
        return function(ele, type, fn){
            ele.addEventListener(type, fn)
        }
    } else if(window.attachEvent){
        return function(ele, type, fn){
            ele.attachEvent('on' + type, fn)
        }
    }
})()
手动实现bind
Function.prototype.myBind = function(context, ...args){
    return (...innerArgs) => {
        this.call(context, ...args, ...innerArgs)
    }
}
防抖节流

https://www.jianshu.com/p/862e87832a06

相关文章

  • 手写简单.bind()实现

    手写一个实现柯里化的.bind() 柯里化:《函数柯里化小结》柯里化:前端开发者进阶之函数柯里化Currying ...

  • 函数式编程(三)—— 柯里化

    柯里化Lodash中的柯里化 —— curry()案例柯里化原理模拟柯里化总结 【函数式编程总体设计】 之前讲了函...

  • [译]JavaScript中的函数柯里化

    原文 Currying in JS 函数柯里化 函数柯里化以Haskell Brooks Curry命名,柯里化是...

  • 简单理解JavaScript中的柯里化和反柯里化

    简单理解JavaScript中的柯里化和反柯里化 前言 本文旨在让大家简单理解柯里化和反柯里化,这里不做深入探究,...

  • 简单理解JavaScript中的柯里化和反柯里化

    简单理解JavaScript中的柯里化和反柯里化 前言 本文旨在让大家简单理解柯里化和反柯里化,这里不做深入探究,...

  • js柯里化

    标签: js柯里化 js柯里化 柯里化是什么在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成...

  • 柯里化和反柯里化

    一、柯里化 定义函数柯里化就是把一个函数中的一些可以固定的参数固定后生成新的函数比如一个函数: 现在有一个需求:就...

  • swift 柯里化

    swift 柯里化 柯里化 1、什么是柯里化? 柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一...

  • JS函数式编程之柯里化

    JS函数式编程之柯里化 为什么要了解柯里化 柯里化是函数式编程必须要使用的. 这里我们就先介绍下什么是柯里化, 然...

  • 柯里化

    f(x)和g(x)合成为f(g(x)),有一个隐藏的前提,就是f和g都只能接受一个参数。 如果可以接受多个参数,比...

网友评论

      本文标题:柯里化

      本文链接:https://www.haomeiwen.com/subject/vubtzctx.html