JS函数柯里化

作者: 大雄的学习人生 | 来源:发表于2018-10-20 00:33 被阅读24次

函数柯里化:提高函数的适用性,同时降低函数的通用性;其实现方式就是固定一些可以预期的参数,然后返回一个特定的函数

其作用主要体现在以下三个方面:

  1. 提高函数的适用性:
    把 map 改造为 tripleMap,提高了函数的适用性,不用每次都传递 triple 这个重复的参数;但同时因为 tripleMap 只能用于 triple 操作,所以降低了函数的适用性;所以函数的柯里化要根据具体的场景使用,不能说函数柯里化就一定好用。
function curryAdapt(fn) {
    var outAgrs = Array.prototype.slice.call(arguments, 1)
    return function () {
        var inArgs = Array.prototype.slice.call(arguments, 0)
        return fn.apply(this, outAgrs.concat(inArgs))
    }
}

function triple(x) {
    return x * 3
}

function map(handler, arr) {
    return arr.map(handler)
}

map(triple, [1, 2, 3])  // [3, 6, 9]
map(triple, [2, 4])     // [6, 12]

var tripleMap = curryAdapt(map, triple)

tripleMap([1, 2, 3])    // [3, 6, 9]
tripleMap([2, 4])       // [6, 12]
  1. 让函数逻辑延迟执行:
    将以下的 add 函数的逻辑,延迟到无参数调用时再执行,同时也起到了固定参数的作用
function curryDelay(fn) {
    var args = []
    return function () {
        if (arguments.length === 0) {
            return fn.apply(this, args)
        } else {
            for (var i = 0; i < arguments.length; i++) {
                args.push(arguments[i])
            }
            return arguments.callee
        }
    }
}

function add() {
    return Array.prototype.reduce.call(arguments, function(sum, now) {
        return sum + now
    })
}

add(3, 4, 5)    // 12

var delayedAdd = curryDelay(add)
delayedAdd(3)(4)(5)()   // 12
  1. 固定易变的参数:
    经典的应用场景就是 Function 类的 bind 函数,下面是自己手写的一个 bind 函数,其不仅起到了固定 this 指针指向的作用,还可以用来提前传递一部分函数参数
Function.prototype.myBind = function (obj) {
    var func = this
    var args = Array.prototype.slice.call(arguments, 1)
    var returnFunc = function() {
        args = args.concat(Array.prototype.slice.call(arguments))
        return func.apply(this instanceof returnFunc ? this : obj, args)
    }
    var Dump = function (){}
    Dump.prototype = func.prototype
    returnFunc.prototype = new Dump()
    return returnFunc
}

相关文章

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

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

  • js柯里化

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

  • JS函数式编程之柯里化

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

  • JS_函数柯里化

    JS_函数柯里化 与函数绑定密切相关的主体是函数柯里化(function currying),它用于创建已经设置好...

  • JS柯里化

    柯里化简介 js柯里化(currying)又译为卡瑞化或加里化,是把接受多个参数的函数,变为可接受多次调用的函数,...

  • JS函数柯里化

    函数柯里化:提高函数的适用性,同时降低函数的通用性;其实现方式就是固定一些可以预期的参数,然后返回一个特定的函数 ...

  • js函数柯里化

    什么是函数柯里化? 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函...

  • JS函数柯里化

    什么是柯里化? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函...

  • JS函数柯里化

    首先看看柯里化到底是什么? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受...

  • Js函数柯里化

    柯里化函数用来干嘛? 用来固定某个函数的一些参数,得到该函数剩余参数的一个新函数,如果没有剩余参数,则调用自己。 ...

网友评论

    本文标题:JS函数柯里化

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