首页 > 其他分享 >js中什么是闭包,它和柯里化函数有什么关系

js中什么是闭包,它和柯里化函数有什么关系

时间:2024-11-01 22:52:11浏览次数:6  
标签:闭包 函数 作用域 js 参数 柯里化 变量

在JavaScript中,闭包是一个非常重要的概念,它指的是一个函数和它声明时所处的词法环境的组合。这意味着该函数可以访问并操作它被创建时作用域中的变量,即使它在那个作用域之外被调用。

闭包的定义和特点

  1. 访问外部变量:闭包允许一个函数访问它被创建时的作用域中的变量,即使这个函数在外部作用域被调用。
  2. 延长变量的生命周期:即使创建闭包的函数已经执行完毕,闭包仍然可以访问那些变量,因为闭包保持了对这些变量的引用。
  3. 数据封装:闭包可以用来创建私有变量,因为外部代码不能直接访问闭包内的变量。

闭包的例子

function createClosure() {
    var secret = "I'm a secret";
    return function() {
        console.log(secret);
    };
}

var closure = createClosure();
closure(); // 输出:I'm a secret

在这个例子中,createClosure 函数创建了一个闭包,这个闭包可以访问 createClosure 函数作用域中的 secret 变量。

柯里化函数

柯里化(Currying)是一种将使用多个参数的函数转换成一系列使用一个或多个参数的函数的技术。在JavaScript中,柯里化函数通常用于创建新的函数,这些函数可以接收部分参数,然后返回一个新的函数来接收剩余的参数。

闭包与柯里化的关系

  1. 实现柯里化:闭包是实现柯里化的关键。通过闭包,我们可以创建一个函数,它记住了之前调用时传入的参数。
  2. 参数记忆:在柯里化过程中,闭包允许函数“记住”之前传入的参数,并在后续的函数调用中使用这些参数。
  3. 函数复用:柯里化函数可以被看作是一种特殊的闭包,它们通过闭包的特性来复用代码和参数。

柯里化的例子

// 定义一个名为curry的函数,它接受一个函数f作为参数
function curry(f) {
    // 返回一个名为curried的新函数,这个新函数可以接收任意数量的参数
    return function curried(...args) {
        // 检查传入的参数数量是否大于或等于原函数f所需的参数数量
        if (args.length >= f.length) {
            // 如果是,那么直接调用原函数f,并传入所有累积的参数args
            return f.apply(this, args);
        } else {
            // 如果参数数量不足,返回一个新的函数
            return function(...args2) {
                // 这个新函数会接收更多的参数args2
                // 并将这些参数与之前的参数合并,再次调用curried函数
                return curried.apply(this, args.concat(args2));
            };
        }
    };
}

// 定义一个名为sum的函数,它接受三个参数a、b和c,并返回它们的和
function sum(a, b, c) {
    return a + b + c;
}

// 使用curry函数对sum函数进行柯里化,得到curriedSum函数
var curriedSum = curry(sum);

// 使用curriedSum函数,并传入参数1,此时不会立即计算,而是返回一个新的函数
// 这个新函数等待接收更多的参数
console.log(curriedSum(1)(2)(3)); // 输出:6

// 另一种使用curriedSum函数的方式,一次性传入两个参数1和2
// 这会返回一个新的函数,这个新函数等待接收最后一个参数
// 当传入参数3时,计算并返回结果
console.log(curriedSum(1, 2)(3)); // 输出:6

在这个例子中,curry 函数返回一个新的函数,这个函数使用闭包记住了之前传入的参数,并在接收到足够的参数后调用原始的 sum 函数。

总结来说,闭包是JavaScript中一个强大的特性,它允许函数访问外部作用域的变量。柯里化是利用闭包特性来创建可以接收部分参数的函数的一种技术。两者在函数式编程中都扮演着重要的角色。

标签:闭包,函数,作用域,js,参数,柯里化,变量
From: https://blog.csdn.net/weixin_44064357/article/details/143442400

相关文章

  • C++写一个简单的JSON解析
    参考用C++编写一个简易的JSON解析器(1)写一个动态类型-知乎欢迎测试和反馈bug首先,json包含string,number,integer,object,array,bool,null这些类型对于object映射,使用map,对于array使用vector我们定义一个类Val用来存储,使用variant来存储具体的值std::variant-cppreferen......
  • 基于node.js+vue核酸检测预约系统后台(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景在全球公共卫生事件的背景下,核酸检测成为防控疫情的重要手段。关于核酸检测相关的研究,现有研究主要集中在检测技术、检测试剂的研发等方面,专门针对核酸检测......
  • 恋爱脑学Rust之闭包三Traits:Fn,FnOnce,FnMut
    在Rust中,FnOnce、FnMut和Fn是三个用于表示闭包(closure)类型的trait。闭包是一种特殊的函数,它可以捕获其环境变量,即在其定义时所处的作用域中的变量。以下是关于这三个trait的详细介绍:1.FnOnce:一生一次的承诺理解:FnOnce就像在爱情中那个“一诺千金”的承诺。它只能被调......
  • JS中计算时数据有误差解决方案
    首先判断需要计算的数字是否为整数//判断一个数字是否为一个整数exportfunctionisInt(num){num=Number(num);returnMath.floor(num)===num}将一个浮点数转为整数,返回整数和倍数。如3.14返回314100exportfunctiontoInt(num){varret={times:1,......
  • protobuf json
    为什么大厂这么爱用protobuf?https://mp.weixin.qq.com/s/COQu3rckfZJUelSVBV6IMA为什么大厂这么爱用protobuf?原创 腾讯技术工程 腾讯技术工程 2024年10月30日17:34 广东 话题背景在protobuf在国内兴起的时候,jsonoverhttp的RESTful,api也在国内同步兴起了。司内也......
  • js手写:防抖&节流 逐行代码解析
    差异分析刚开始写节流的时候,没有真正理解其难点,而且网上的防抖和节流函数,不得不说,真的是鱼龙混杂,有些看了简直添乱。    之前一直认为节流就是“时间间隔T内,点击一个按钮n次,只执行第1和n次”,完全没有体会到节流的难点其实在于多次相同的调用时传递的不同的!参数!防抖......
  • NodeJS动漫论坛-计算机毕业设计源码09947
    基于微信小程序的动漫论坛摘 要随着移动互联网的飞速发展,智能手机和移动互联网已经成为人们日常生活中不可或缺的一部分。在这样的背景下,微信小程序应运而生,凭借其无需下载安装、即用即走的特点,迅速成为连接用户与服务的桥梁。动漫作为一种深受年轻人喜爱的文化形式,拥有庞......
  • 用文字“画出”时序图:用 AI+Mermaid.js 解决交互过程中的问题
    什么是时序图序列图是一种用于描述对象之间在时间上的交互顺序的图表。它可以展示对象之间是如何相互作用的,以及这些交互的顺序。什么是MermaidMermaid.js是一个开源项目,它允许你通过简单的文本代码来绘制图表。无论你是开发者、学生还是普通用户,它都能帮助你将复杂的信息以......
  • JS里的this
    用来访问对象的this不可靠的外部变量名访问letuser={name:"John",age:30,sayHi(){alert(user.name);//"user"外部变量名}};user.sayHi();//TypeError:Cannotreadproperty'name'ofnull如果我们决定将user复制给另一个变量,例如admin......
  • 基于nodejs+vue基于的农贸市场网站的设计与实现[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于农贸市场网站的设计与实现问题的研究,现有研究主要以农贸市场的实体运营、传统管理模式为主,专门针对基于特定功能的农贸市场网站设计与实现的研究较......