返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JS中函数科里化的背景与应用实例教程
  • 233
分享到

JS中函数科里化的背景与应用实例教程

2024-04-02 19:04:59 233人浏览 薄情痞子
摘要

目录背景使用场景js中的函数科里化经典面试题:add(1)(2)(3)总结背景 柯里化(Currying)是一种关于函数的高阶技术。它不仅被用于 javascript,还被用于其他编

背景

柯里化(Currying)是一种关于函数的高阶技术。它不仅被用于 javascript,还被用于其他编程语言。函数柯里化又叫部分求值,维基百科中对柯里化 (Currying) 的定义为:

数学和计算机科学中,柯里化是一种将使用多个参数的函数转换成一系列使用一个参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

用大白话来说就是只传递给函数一部分参数来调用它,让它返回一个新函数去处理剩下的参数。使用一个简单的例子来介绍下,最常用的就是 add 函数了。

// add method
const add = (...args) => args.reduce((a, b) => a + b);

// 传入多个参数,执行 add 函数
add(1, 2) // 返回 3

// 假设我们实现了一个 currying 函数,支持一次传入一个参数
let sum = currying(add);
let addCurryOne = sum(1);
addCurryOne(2) // 返回 3
addCurryOne(3) // 返回 4

使用场景

柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)。柯里化不会调用函数。它只是对函数进行转换。 在平常工作中主要使用场景如下:

  • 1、延迟计算(部分求和、bind 函数)

  • 2、动态创建函数(添加监听 addEvent、惰性函数)

  • 3、参数复用(Function.prototype.call.bind(Object.prototype.toString))

JS中的函数科里化

可以对比下haskell这种天然的函数式语言,js里的珂里化实在是残缺不全...但是利用珂里化这种参数对应函数的思想,结合js的闭包特性,来实现良好的封装。 举个例子:js中最常见的dom的插入和删除。 普通写法:变量都在外部,不能确保每个remove操作都“正确”的

var append = function (parent, child) {
    parent.appendChild(child);
}
var remove = function (dom) {
    dom.remove();
}
//插入 remove(child); //删除
append(parent, child); 

文艺写法:确保了每个删除操作都会删除插入的节点。

var append = function (parent, child) {
    parent.appendChild(child);
    return function () {
        child.remove();
    }
}

//或者是这种,point free风格 
var append2 = function (parent, child) {
    parent.appendChild(child);
    return child.remove.bind(child);
}
//插入一个节点,同时返回所插入的节点的删除操作。 remove(); //删除。
var remove = append(parent, child);

总结一下就是说,这种以函作为主体,确保了函数之间不会相互干扰,尤其是在复杂的前端工程下,每一处的代码越“安全”,越独立,越能更好的拓展功能和排查问题。

经典面试题:add(1)(2)(3)

function add(seed) {
    function retVal(later) {
        return add(seed + later);
    }
    retVal.toString = function () {
        return seed;
    };
    return retVal;
}
console.log(add(1)(2)(3).toString()); // 6

add函数返回闭包retVal,在retVal中又继续调用add,最终我们可以写成add(1)(2)(3)(...)这样柯里化的形式。 每调用一次add函数,都会返回retValue函数;调用retValue函数会调用add函数,然后还是返回retValue函数,所以调用add的结果一定是返回一个retValue函数。add函数的存在意义只是为了提供闭包,这个类似的递归调用每次调用add都会生成一个新的闭包。

总结

优点:

  • 参数复用
  • 提前返回
  • 延迟计算/运行

缺点:

  • 函数柯里化可以用来构建复杂的算法 和 功能, 但是滥用也会带来额外的开销。从上面实现部分的代码中,可以看到,使用柯里化函数,离不开闭包, arguments, 递归。
  • 闭包,函数中的变量都保存在内存中,内存消耗大,有可能导致内存泄漏。
  • 递归,效率非常
  • arguments, 变量存取慢,访问性很差

我个人觉得柯里化并非是必须的,而且不熟悉的同学阅读起来可能会遇到麻烦,但是它能帮助我们理解JS中的函数式编程,更重要的是,我们以后在阅读类似的代码时,不会感到陌生。

并非“柯里化”对函数式编程有意义。而是,函数式编程在把函数当作一等公民的同时,就不可避免的会产生“柯里化”这种用法。所以它并不是因为“有什么意义”才出现的。

到此这篇关于JS中函数科里化的背景与应用的文章就介绍到这了,更多相关JS函数科里化应用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JS中函数科里化的背景与应用实例教程

本文链接: https://lsjlt.com/news/150561.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS中函数科里化的背景与应用实例教程
    目录背景使用场景JS中的函数科里化经典面试题:add(1)(2)(3)总结背景 柯里化(Currying)是一种关于函数的高阶技术。它不仅被用于 JavaScript,还被用于其他编...
    99+
    2024-04-02
  • Oracle DECODE函数实例分析与应用场景
    Oracle DECODE函数是一种非常常用的条件表达式函数,其主要功能是根据指定的条件对表达式的结果进行转换并返回相应的值。DECODE函数的语法如下:DECODE(expr, se...
    99+
    2024-03-08
    分析 oracle decode sql语句
  • Oracle DECODE函数实例详解与应用场景
    Oracle数据库是一种流行的关系型数据库管理系统,它提供了丰富的函数和工具来处理复杂的数据操作。其中,DECODE函数是一个非常常用的函数之一,可以根据指定的条件对数据进行转换和处理...
    99+
    2024-03-07
    应用 oracle decode
  • 实例演示:Python中int()函数的实际应用场景
    Python中的int()函数是用来将字符串或数字转换为整数的内置函数。在编程中,我们经常会遇到需要将字符串或其他类型的数据转换为整数的情况。本文将通过具体的代码示例来演示int()函...
    99+
    2024-04-02
  • JS防抖节流函数的实现与使用场景
    目录一、什么是函数防抖 1、为什么需要函数防抖? 2、函数防抖的要点3、函数防抖的实现 4、函数防抖的使用场景 二、什么是函数节流 1、函数节流的要点 2、函数节流的实现3、函数节流...
    99+
    2024-04-02
  • MySQL中sum函数使用的实例教程
    文章简介 今天分享一下MySQL中的sum函数使用。该函数已经成为大家操作MySQL数据库中时常用到的一个函数,这个函数统计满足条件行中指定列的和,想必肯定大家都知道了,本身就没什么讲头了,这篇文章主要是通过几个小...
    99+
    2022-05-13
    mysql sum函数求和 sql sum函数求和 mysql sum函数函数
  • C语言函数加里化和偏函数应用实例分析
    今天小编给大家分享一下C语言函数加里化和偏函数应用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。【名词解释】Curr...
    99+
    2023-06-17
  • TypeScript的函数定义与使用案例教程
    TypeScript中函数的定义和使用 1. 声明一个函数约束其传参类型,以及返回值类型 传入两个参数,没有返回值 const fun1 = (key: string, va...
    99+
    2024-04-02
  • Golang函数库在不同场景中的应用案例
    go 标准函数库具有广泛的应用场景,例如:解析 csv 数据。发出 http 请求。管理并发协程。序列化和反序列化自定义结构体。获取操作系统信息。这些函数库简化了开发过程,提高了生产力和...
    99+
    2024-04-18
    golang 函数库
  • 深入分析与实例:Python中的lambda函数应用
    Python中lambda函数的实例应用与案例分析 Python是一门多范式的编程语言,支持函数式编程。在函数式编程中,lambda函数是一种非常有用的工具。它是一种匿名函数,可以在需要函数的地方使用,并且可以快速定义简单的功能...
    99+
    2024-02-03
    案例分析 lambda函数 实例应用
  • Oracle的常用字符函数实例教程
    这篇文章主要介绍“Oracle的常用字符函数实例教程”,在日常操作中,相信很多人在Oracle的常用字符函数实例教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle...
    99+
    2024-04-02
  • Go动态调用函数的实例教程
    目录前言JavaScript 动态调用函数Go 中动态调用方法前言 经常在开发的时候会遇到这样的场景,几个模块的都有相同的方法,但会因为不同的类型的需要调用不同模块的方法。使用一个 ...
    99+
    2023-01-03
    Go动态调用函数 Go动态调用
  • js位运算在实际中使用的实例教程
    目录什么是位运算业务场景:解决办法办法一:办法二:附:位运算的综合应用总结什么是位运算 从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行...
    99+
    2024-04-02
  • Go语言函数的递归调用与实际应用场景
    标题:Go语言函数的递归调用与实际应用场景 在Go语言中,函数的递归调用是一种强大的编程技巧,可以简洁地解决某些复杂的问题。递归调用指的是函数直接或间接地调用自身,通过将一个大问题拆分...
    99+
    2024-04-02
  • C++ 函数模板在元编程中的应用场景?
    元编程中应用 c++++ 函数模板的场景包括:元组编程:编译时创建和操作元组。静态反射:提取类型及其成员的信息。代码生成:根据传入类型生成定制代码。编译时验证:强制执行编译时检查。 C...
    99+
    2024-04-15
    元编程 函数模板 c++
  • golang函数并发控制在web应用程序中的应用场景
    在 web 应用程序中,go 语言的函数并发控制可以实现以下场景:并行处理高并发 http 请求,避免同步处理的阻塞;并行执行耗时的任务,提升性能;使用 goroutine 池高效管理 ...
    99+
    2024-04-24
    web应用程序 并发控制 golang
  • Oracle存储过程与函数的区别及应用场景解析
    Oracle存储过程与函数的区别及应用场景解析 在Oracle数据库中,存储过程和函数是两种常用的数据库对象,它们在实际的开发工作中扮演着重要的角色。本文将就Oracle存储过程与函数...
    99+
    2024-03-02
    函数 oracle 存储过程 sql语句
  • 函数指针在 C++ 函数式编程中的应用场景有哪些?
    函数指针在 c++++ 函数式编程中主要用于:高阶函数:接收或返回函数的函数。匿名函数:通过 lambda 表达式创建的函数。回调函数:在其他函数执行时调用的函数。 函数指针在 C++...
    99+
    2024-04-17
    c++ 函数指针
  • Python 函数式编程在数据科学中的应用:揭示新视野
    不可变性: 函数式编程的核心原则之一是不可变性,这意味着函数操作的数据不能被修改。这消除了数据竞争的风险,并促进了并发编程。在数据科学中,不可变性特别有用,因为它确保了数据集的完整性和可重复性。 纯函数: 纯函数是输入相同时始终产生相同输...
    99+
    2024-04-02
  • 阿里云结构化数据库全面解析与应用实例
    本文将详细介绍阿里云的结构化数据库产品,包括产品特性和应用实例。了解这些内容有助于理解如何在阿里云上部署和管理结构化数据。 一、阿里云结构化数据库概述阿里云结构化数据库(Structured DataStore)是阿里云提供的一种高性能、高...
    99+
    2023-12-12
    阿里 结构化 应用实例
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作