JS闭包函数和回调函数

RAG优化知识库检索(4):混合检索技术 混合检索技术在RAG(检索增强生成)系统中的应用显著提升了检索效果。本文探讨了语义检索与关键词检索的优缺点,指出两者在语义理解和精确匹配方面的互补性。通过结合BM25与向量检索,混合检索系统能够更全面地捕捉文档的相关性。文章详细介绍了并行检索、级联检索、稀疏-密集混合表示等多种结合方式,并探讨了权重调整策略,如线性组合、动态权重调整和排序融合算法。此外,稀疏-密集混合检索架构的设计和实现方案也被深入分析,展示了如何通过结合不同检索方法的优势,提升RAG系统的检索质量和效率。 阅读详情

一、闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。闭包就是能够读取其他函数内部变量的函数。可以把闭包简单理解成”定义在一个函数内部的函数”。
闭包有三个特性:
1.函数嵌套函数;
2.函数内部可以引用外部的参数和变量;
3.参数和变量不会被垃圾回收机制回收。
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。使用闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量。全局变量在每个模块都可调用,这势必将是灾难性的。所以推荐使用私有的,封装的局部变量。一般函数执行完毕后,局部活动对象就被销毁,内存中仅仅保存全局作用域。但闭包的情况不同!
示例一:
//闭包就是一个函数的返回值为另外一个函数,在outer外部可以通过这个返回的函数访问outer内的局部变量.

function outer(){
     var val = 0;
     return function (){
           val += 1;
           document.write(val + "<br />");
     };
}
var outObj = outer();
outObj();//1,执行val += 1后,val还在
outObj();//2
outObj = null;//val 被回收
var outObj1 = outer();
outObj1();//1
outObj1();//2

闭包会使变量始终保存在内存中,如果不当使用会增大内存消耗(如果上例中定义很多outer(),则内存中会保存很多val变量)。
javascript的垃圾回收原理:
(1)、在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收;
(2)、如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。
那么使用闭包有什么好处呢?使用闭包的好处是:
1.希望一个变量长期驻扎在内存中
2.避免全局变量的污染
3.私有成员的存在

二、回调

百度百科:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。
回调函数原理:我现在出发,到了通知你”。这是一个异步的流程,“我出发”这个过程中(函数执行),“你”可以去做任何事,“到了”(函数执行完毕)“通知你”(回调)进行之后的流程。
示例一:

function doSomething(callback){
     callback(1,2);
}
function numberAdd(a,b){
     document.write(a+b);
}
doSomething(numberAdd);//3

示例二:

function Thing(name){
     this.name = name;
}

//在Thing类里加入doSomething方法,这里使用了构造器调用模式

Thing.prototype.doSomething = function(callback){
   callback(this.name);
};
function showName(name){
   document.write(name);
}
var t = new Thing("zhangsan");
t.doSomething(showName);//zhangsan

如果你有一个数字组成的数组,你想写个排序的公共方法,但是排序方式(从小到大或从大到小)是调用该排序方法的人决定。实现该排序方法可以用回调来实现,当然你可以写2个方法,一个是从小到大的排序,一个是从大到小的排序方法。回调个人认为就是将决定权交给了实际业务开发工程师,由他来决定怎么去处理,这种思路跟我们平常接触的不同,有点不习惯,但是这种思路在异步编程中特别能看出它的好处,不知道我这么理解是否正确。下面示例代码就是回调的典型使用场合:

var arr = [25,13,33,8,23,32];
Array.prototype.sort = function(callback){
     var arr = this;
     var i = 0;//i在这里定义与在for循环的括号内(for(var i = 0; i < ...))定义是一样的
     for(; i < arr.length-1; i++){
          var j = i + 1;
          for(; j < arr.length;j++){
               if(callback(arr[i],arr[j])){
                    var temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
               }
          }    
     }
return arr;
};
//a-b>0表示数组从小到大排序
arr.sort(function(a,b){
     return a - b > 0;
});
document.write(arr.join(",") + "<br />");//8,13,23,25,32,33
//b-a>0表示数组从大到小排序
arr.sort(function(a,b){
     return b - a > 0;
});
document.write(arr.join(","));//33,32,25,23,13,8

回调函数的使用场合:
资源加载:动态加载js文件后执行回调,加载iframe后执行回调,ajax操作回调,图片加载完成执行回调,AJAX等等。
DOM事件及Node.js事件基于回调机制(Node.js回调可能会出现多层回调嵌套的问题)。
setTimeout的延迟时间为0,这个hack经常被用到,settimeout调用的函数其实就是一个callback的体现
链式调用:链式调用的时候,在赋值器(setter)方法中(或者本身没有返回值的方法中)很容易实现链式调用,而取值器(getter)相对来说不好实现链式调用,因为你需要取值器返回你需要的数据而不是this指针,如果要实现链式方法,可以用回调函数来实现setTimeout、setInterval的函数调用得到其返回值。由于两个函数都是异步的,即:他们的调用时序和程序的主流程是相对独立的,所以没有办法在主体里面等待它们的返回值,它们被打开的时候程序也不会停下来等待,否则也就失去了setTimeout及setInterval的意义了,所以用return已经没有意义,只能使用callback。callback的意义在于将timer执行的结果通知给代理函数进行及时处理。

Unity之ASE+ShaderGraph+VFX入门到精通 目录 这里是ASE+ShaderGraph+VFX从入门到精通专栏的目录,不停更新中,有问题随时留言或者私信。 阅读详情

相关推荐

【Unity】制作简易三维场景

本文介绍如何制作一个三维场景

CiNian_的博客 5333

进阶 | 回调函数(callback)是什么?

关注、星标公众号,直达精彩内容一、什么是回调函数1.1、回调函数的定义和基本概念回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。回调函数通常用于事件处理、异步编程和处理各种操作系统和框架的API。基本概念:回调:指被传入到另一个函数的函数。异步编程:指在代码执行时不会阻塞程序运行的方式。事件驱动:指程序的执行是由外部事件触发而不是顺序执行的方式。1.2、回调函...

李肖遥的专栏 717

从原理到实现:在《图灵完备》中构建一个144*256像素、1536时钟刻/帧的视频播放器

本文详细解析了在《图灵完备》游戏中构建144*256像素、1536时钟刻/帧视频播放器的全过程。从图灵完备原理出发,通过分层架构设计、视频数据预处理和关键电路实现,展示了如何用基础电子元件模拟现代显卡功能。重点介绍了像素坐标定位系统和颜色数据处理流水线的优化方案,为游戏内复杂电子系统设计提供实践指导。

weixin_42520025的博客 445

js 【详解】闭包

如果一个函数访问了此函数的父级及父级以上的作用域变量,那么这个函数就是一个闭包。

朝阳39的博客 3万+

【老生谈算法】可视化通道流中瞬时涡量场的算法实现与MATLAB源码分析——瞬时涡量场

本文旨在探讨可视化通道流中瞬时涡量场的方法,并通过MATLAB编程实现这一过程。涡量场作为描述流体旋涡强度和方向的重要物理量,对于理解复杂流体运动具有重要意义。本文首先介绍了涡量场的基本概念,随后详细阐述了从测量数据收集到涡量场可视化的完整流程,并给出了相应的MATLAB源码。通过实际运行该源码,我们展示了涡量场的可视化结果,并讨论了其在流动结构识别和动力学行为理解中的应用。关键词: 涡量场;流体运动;MATLAB;可视化;PIV一、引言。

m0_53407570的博客 1125

DSShop移动商城网店系统 反序列化RCE漏洞复现

DSShop单店铺移动商城网店系统的getCartList方法的cart参数存在php反序列化漏洞,攻击者可以通过漏洞执行任意代码,获取服务器权限。

0xSec 1472

javascript之函数2(闭包)

目录 前言 一、"闭包"函数 1、概念 2、作用 3、特性 4、创建 5、常用闭包 6、闭包的缺点 前言 了解闭包函数之前,我们需要复习一下作用域链。在js中,内层函数在执行过程中,若需要引入某个变量,则需要由当前作用域逐层寻找,直到全局作用域。那也就是说,在外层作用域下无法获取内层作用域下的变量。同样,不同函数作用域也是不能相互访问彼此变量的。为了解决这个问题,我们就需要用到闭包。 一、"闭包"函数 1、概念 闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套..

YANGMENGZHENG的博客 1004

Lammps实现结冰匀相成核

Lammps实现结冰匀相成核

Rockyoung 3848

JavaScript里的回调函数属于闭包吗?

它们在 JavaScript 中被广泛使用,例如在处理 AJAX 请求、定时器、事件处理程序等方面。函数中定义的,但是在回调函数中也可以访问它,这是因为回调函数形成了一个闭包。回调函数本身不一定属于闭包,但是在某些情况下,它们可能会涉及闭包。,并调用了传入的回调函数。在回调函数中,它使用了。函数,并将一个回调函数作为参数传递给它。函数执行完毕后,回调函数仍然可以访问。在使用回调函数时,如果回调函数引用了。函数中的回调函数被创建并保存了对。,则回调函数将形成一个闭包。函数内部,它定义了一个变量。

风清扬的专栏 1208

向华为学习——解读华为战略规划SP与业务计划BP流程【附全文阅读】

该方案针对大中型企业高管及战略团队,系统拆解华为SP(4-9月中长期规划)与BP(10-12月年度执行)双轨体系,形成"战略制定-业务设计-资源配置-绩效解码"闭环。SP侧重市场趋势分析、业务优先级与资源分配,BP细化KPI、预算及行动计划。通过价值树、战略解码等工具实现战略到部门/个人的目标分解,强化跨部门协同与过程管控。配套17份华为实战资料(包括战略管理、流程优化、销售组织建设等核心方法论),助力企业建立规范的战略执行体系,实现资源优化与绩效落地。

cdfunlove的博客 769

12、有杆泵抽油系统:原理、性能与选择

本文全面介绍了有杆泵抽油系统的原理、性能分析和设备选择方法。有杆泵抽油系统广泛应用于石油开采领域,通过地面抽油装置与井下柱塞泵的配合,实现高效、稳定的原油提升。文章详细解析了系统的工作原理、组成结构、光杆运动特性、载荷计算、泵输送能力及功率需求,并提供了抽油装置的选择流程和实际案例分析。此外,还探讨了泵的容积效率影响因素、示功图的作用及系统优化运行的建议,为石油开采工程提供了理论支持和实践指导。

gan8painter的博客 434

JavaScript----闭包函数

闭包函数 作用域链 优缺点

m0_58646138的博客 3870

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Javascript 函数进阶 ——【回调函数、递归函数、闭包函数、作用域和域解析】

Javascript 作用域和域解析一、作用域全局作用域 一、作用域 全局作用域 JavaScript作用域 : 就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突 js的作用域(es6)之前 : 全局作用域 局部作用域 全局作用域: 整个script标签 或者是一个单独的js文件 var num = 10; var num = 30; console.log(num); 局部作用域 局部作用域(函数作用域) 在函数内部就是局部作用域 这个代码

impact_factor的博客 1186

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JS中的回调函数和闭包

一、 回调函数 1. 一般在异步操作中,当异步操作结束,需要回到主线程做点事情,需要用到回调函数 2. 经常应用在书写类或者矿建等公用性比较高的模块 3. 回调函数就是将函数作为参数使用,作为函数参数的函数就是回调函数 二、闭包 1. 变量的作用域:全局变量和局部变量 1)全局变量在当前全局可以到处调用,但是局部变量只能在局部调用 2)函数能够分离出一个独立的作用域 3)函数内部声明的变量...

weixin_43846130的博客 1334

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

javascript分析闭包和回调函数

&lt;div id="box1"&gt;First Box&lt;/div&gt; &lt;div id="box2"&gt;Second Box&lt;/div&gt; &lt;script&gt; function animateIt(elementId) { var elem = document.getElementById(elementId);

且听真言 557

javascript中的回调函数

回调函数的认识 一个回调函数,也被称为高阶函数 就是将一个函数作为参数(实参)传递给另一个函数(形参) #重点# 一个回调函数本质上是一种编程模式,因此也叫回调模式 因为函数在Javascript中是第一类对象,我们像对待对象一样对待函数,因此我们能像传递变量一样传递函数,在函数中返回函数,在其他函数中使用函数。当我们将一个回调函数作为参数传递给另一个函数时,我们仅仅传递了函数定义。我...

北芒的博客 1481

JavaScript函数进阶(闭包函数,嵌套和递归,回调函数,匿名函数,箭头函数)

函数进阶

2301_77135626的博客 748

闭包-回调函数

回调函数

Chenche_的博客 1373

Js简单的回调函数和闭包结合小例子

偷个懒, 不解释了 如果不懂或者有问题欢迎评论区提问,当然如果你有更好的例子也欢迎分享 function callback(call){ console.log('运行callBack'); return function(){ console.log('运行到bar'); call(123); } } function takeIt(){ callback((msg) => { console.log(msg); .

AzeShinja的博客 216

php回调函数是怎么实现的,JS回调函数原理与用法详解【附PHP回调函数】

本文实例讲述了JS回调函数原理与用法。分享给大家供大家参考,具体如下:JS回调函数何为回调函数,官方解释:当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callbac...

weixin_42498766的博客 244

闭包和回调函数

闭包和回调函数

Mr_115的博客 1185

闭包、回调函数、Node的包管理器

闭包、回调函数、Node的包管理器

weixin_44892365的博客 215

php回调当前函数,PHP 基础函数(四)回调函数

Go基础系列:函数&lpar;2&rpar;——回调函数和闭包回调函数和闭包 当函数具备以下两种特性的时候,就可以称之为高阶函数(high order functions): 函数可以作为另一个函数的参数(典型用法是回调函数) 函数可以返回另一个函数,即让另一个 ...php变量函数,回调函数一,变量可以直接传递函数 ...

weixin_39631350的博客 213

JavaScript中必懂的基础知识typeof和instanceof区别,什么是回调函数,什么是闭包,什么是内存泄漏,哪些操作会造成内存泄漏,如何解决?原型和原型链的理解,数组的一些方法.....

① typeof和instanceof区别 typeof介绍 在js中typeof用来判断某个变量的类型,并且只能区分值类型,可分为js的两种数据类型介绍, 简单数据类型 数字类型,typeof返回是number; 字符串类型,typeof返回是string; 布尔类型,typeof返回是boolean; 未定义,typeof返回是undefind; null,typeof返回是object; 引用类型(复杂数据类型) 对象,数组,typeof返回是object; 函数,返回值是functi..

cmhahaha的博客 213

javascript中存在闭包的情况,不要再问我闭包是什么了!

javascript中存在闭包的情况,不要再问我闭包是什么了!

有一棵树的博客 187

JS部分知识:什么是闭包

在函数1内部创建函数2,若函数2调用函数1的变量,就会形成闭包。假设调用的是变量a,即使函数1执行完成后,变量a也不会释放,JavaScript会为它形成一个专门的执行上下文, 保存变量a的执行环境,这个执行环境就是闭包。 闭包可以用于封装函数的内部变量,因为从外部是无法访问到函数内部变量的,但是通过闭包就可以实现这一点。 另外闭包可以进行回调函数,它可以返回一个函数在将来需要调用时再调用,并且能缓存之前的执行环境。 嘿嘿~ ...

qq_44171586的博客 399
上一篇: display:inline、block、inline-block的区别
下一篇: javascript:void(0)使用介绍与伪协议
澪月
博客等级 码龄11年 29粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值