首页 > 其他分享 >浅谈闭包(防抖,节流,函数柯里化)

浅谈闭包(防抖,节流,函数柯里化)

时间:2024-01-30 18:56:06浏览次数:34  
标签:闭包 function 防抖 return 浅谈 参数 柯里化 函数

闭包参考文章

谈谈你对闭包的理解
概念:
(1) 闭包就是引用了另一个函数的变量的函数
(2) 闭包一般是函数嵌套,一个函数返回另外一个函数,内部函数访问外部函数的变量就形成了一个闭包
作用(优点):
(3) 闭包的优点是可以私有化变量,将变量私有化到函数内部,并在私有化的基础上进行数据保持
用途:
(4) 闭包在防抖节流函数柯里化,都应用里数据保持这个特性

(5) 在防抖函数中,第一次点击的时候,我们会let一个time一个定时器,如果不采用闭包的话,下次触发函数会重新创建一个新的定时器,两个定时器的引用不同,是没有关联的,使用闭包可以直接在内存中找到之前创建的计时器,调用就可以直接拿到对应的定时器的时间
缺点:
(6) 闭包的缺点是容易造成内存泄露,因为闭包创建的变量会一直存在内存中,需要及时置空,否则会造成内存泄露,影响程序性能

清除闭包,使闭包函数等于null,例如debounce=null
闭包注意两点:

  1. 闭包不一定有return
  2. 闭包也不一定有内存泄漏
//防抖
function debounce(fn,delay){
               let timer  = null
               return function(){
                   // 如果存在点击事件就清除,第一次肯定不存在,执行定时器,正在执行的时候下一个请求进来,就关闭上个,继续下一个定时器
                   if(timer){
                       clearTimeout(timer)
                   } 
                   timer = setTimeout(fn,delay)
               }
           }


 // 节流
           function thorate(fn,delay){
               var valid  = true
               return function(){
                   if(!valid ){
                       return false
                   }
                   valid = false
                   // 一段时间之后再调起函数
                   let timer = setTimeout(()=>{
                       fn();
                       valid = true
                   },delay)
               }
           }

// 函数柯里化

       function sum(args) {
           return args.reduce((pre, cur) => pre + cur, 0)
       }

       function curry(...args) {
           let sumVal = sum(args)
           return function calc(...newArgs) {
               if (newArgs.length > 0) {
                   console.log(newArgs);
                   sumVal += sum(newArgs)
                   return calc
               } else {
                   return sumVal
               }
           }

       }
       console.log(curry(1)(1)(10)());

 // 针对函数参数进行优化
       function uri_curry(protocol){
           return function (hostname,pathname){
              return `${protocol}${hostname}${pathname}`
           }

       }
       const uri_https = uri_curry('https://')
       const uri1 = uri_https('www.baidu.com','/真棒')
       const uri2 = uri_https('www.baidu.com','/加油')
       console.log(uri1,uri2);

tips:
函数柯里化:
针对函数参数进行优化
官方解释:
柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
简单来说,就是固定一个需要多个参数的函数的部分参数,返回一个接受剩余参数的函数,当然这个转化流程需要固定多少个参数,返回的函数需要接收多少个参数,这都是有开发者自己定义的,当然,这两个的个数相加会等于这个函数原始情况需要的参数个数。
reduce()
定义一个相加 reduce()方法是JavaScript中的一个内置方法,主要用于对数据进行归并操作。它通常用于计算数组中所有元素的和。

具体来说,reduce()方法会遍历数组的每一个元素,并将这些元素传递给用户提供的回调函数。该回调函数接受四个参数:前一个值、当前项、当前项的索引以及整个数组的引用。函数的返回值将作为下一个遍历过程中的输入值。

此外,reduce()方法需要传入第二个参数,即归并计算的初始值

标签:闭包,function,防抖,return,浅谈,参数,柯里化,函数
From: https://www.cnblogs.com/wszzj/p/17997753

相关文章

  • (一)浅谈ADO.NET对象之间的关系
    一、Database:数据源,这里比喻水源二、Connection:连接数据源对象,类似伸入到水源的水管三、Command:数据库语句执行对象,类似抽水机四、DataAdapter、DataReader:数据适配器,类似输水管五、DataSet:数据集,类似水库六、DataTable:数据表,类似水池......
  • 浅谈Rust数据所有权
    Rust的目标之一,是能够作为一门内存高效且内存安全的语言。本文我们将重点关注Rust关于“内存高效”的语言设计,让读者能够建立起对Rust的基本认知。内存高效一个不恰当的比喻:将一座房子卖给另一个人的时候,究竟是从头开始建一座同样的房子,然后把这座新房子的房产证交给买家的方式......
  • 防抖
    function debounce(func, delay) {    let timerId;      return function() {        clearTimeout(timerId); // 清除之前设置的计时器              const context = this;        const args = arguments;  ......
  • 浅谈电厂电能管理及开关状态在线监测系统的开发
    【摘要】:基于某大型电厂的分层分布式电能管理及开关状态在线监测系统的实际案例,介绍了发电厂电能管理系统的开发情况、网络结构及系统功能,探讨了开关状态在线监测技术的原理和实现,实际证明,系统通用生强、开放性和可维护性好。【关键词】:电能管理;开关状态;在线监测0.前言近年来......
  • 浅谈主数据管理项目建设思路
    主数据是数据之源,是数据资产管理的核心,是信息系统互联互通的基石,是信息化和数字化的重要基础。——《主数据管理实践白皮书》 近期,国家印发《数字中国建设整体布局规划》,提出数字中国建设的整体框架,标志着数字经济被放到更重要的位置。而主数据管理作为数据治理的重要一环,科......
  • Rust 中的函数式语言功能:迭代器与闭包
    对原文做了删减,原文参考Rust中的函数式语言功能:迭代器与闭包。目录闭包:可以捕获环境的匿名函数闭包会捕获其环境闭包类型推断和注解捕获引用或者移动所有权将被捕获的值移出闭包和Fntrait使用迭代器处理元素序列Iteratortrait和next方法消费迭代器的方法产生其他迭代器的......
  • 无涯教程-Scala - 闭包
    closure闭包是一个函数,其返回值取决于在此函数外部声明的一个或多个变量的值。以下带有匿名函数的代码。valmultiplier=(i:Int)=>i*10这里,函数体中使用的唯一变量i*10是i,它被定义为函数的参数,尝试以下代码-valmultiplier=(i:Int)=>i*factor乘数中有两个自由变......
  • 浅谈Python两大爬虫库——urllib库和requests库区别
    在Python中,网络爬虫是一个重要的应用领域。为了实现网络爬虫,Python提供了许多库来发送HTTP请求和处理响应。其中,urllib和requests是两个最常用的库。它们都能够帮助开发人员轻松地获取网页内容,但在使用方式、功能和效率上存在一些差异。本文将深入探讨这两个库的区别,帮助你更好地选......
  • js封装防抖函数
    js封装的防抖函数/**防抖函数*@param{Function}func*@param{number}wait*@param{boolean}immediate*@return{*}*/exportfunctiondebounce(func,wait,immediate){lettimeout,args,context,timestamp,resultconstlater=function(){......
  • 无涯教程-Rust - 迭代&闭包
    在本章中,我们将学习RUST中的迭代器和闭包如何工作。Iterator迭代器迭代器有助于迭代值的集合,例如数组,向量,Map映射等,迭代器实现Rust标准库中定义的Iteratortrait,iter()方法返回集合的迭代器对象,迭代器对象中的值称为元素,迭代器的next()方法可用于遍历元素,当到达集合末尾时,next......