[JS]闭包就是这么简单

PaddleOCR转ONNX模型实战:5分钟搞定中文OCR推理部署(附完整代码) 本文详细介绍了将PaddleOCR模型转换为ONNX格式并进行高效推理部署的完整实战方案。通过Paddle2ONNX工具实现模型转换,利用ONNX Runtime构建跨平台推理引擎,涵盖环境配置、模型优化、批量处理及多平台部署等关键步骤,显著提升中文OCR在边缘设备上的推理性能。 阅读详情

十分钟掌握版

什么是闭包

闭包是指有权访问另一个函数作用域中的变量的函数

这句话怎么理解?别急。我们先看一个例子:

function fun(){
    //函数内部定义了一个函数变量
    var privateVal="private value";
}
console.log(privateVal);   //报错:privateVal is not defined
var temFun=fun; 
console.log(temFun.privateVal); //报错:privateVal is not defined

根据JS中作用域链的概念( 什么是JS作用域链):

内部环境能够通过作用域链访问所有外部环境变量和函数,外部环境不能访问内部环境的任何变量和函数

所以我们在全局作用域中访问不到函数fun()中的privateVal变量。

当当当,这时候就轮到我们闭包上场了:

function fun(){
    //函数内部的变量,函数外部无法访问
    var privateVal="private value";

    //下面就是闭包的精髓:
    //在函数内部返回一个匿名函数,匿名函数能够访问fun函数的变量
    return function(){
        return privateVal;
    }
}
fun()();      //第一个()执行了fun函数,返回值是一个匿名函数;第二个执行了匿名函数
              //因此输出了:“private value”

//以下代码,等同于fun()()

var temFun=fun();
console.log(temFun());    //输出:“private value”

上面这个例子很好的解释了闭包的用法和概念:

闭包是指有权访问另一个函数作用域中的变量的函数

闭包的使用场景

封装局部变量

例如:一个游戏,主人公有10条命,我们如果把var live=10写在全局作用域的话,全局中任何地方都能调用修改,就会出现安全性,容易出bug。

但如果写在局部作用域,会有如下问题:

1、在全局环境中却调用不了。

2、局部环境执行完毕后,会被清出环境栈,局部环境中的变量和函数都会垃圾回收机制回收。(关于为什么函数环境执行完毕,闭包函数还能访问上一个函数的变量,我们在下面再详细分析)

因此我们用闭包去将var live=10变量封装起来。

function liveFun(){
   var live=10; 
    //下面是闭包函数代码
    return function(condition){
        if(condition=="add"){
            return live+=1;
        }else if(condition== "reduce"){
            return live-=1;
        }
    }
}
var live=liveFun();
console.log(live("add"));   //执行闭包函数,10+1=11,输出:11;
console.log(live("reduce"));   //执行闭包函数,11-1=10,又输出:10

应付面试

其实闭包函数在框架中使用的比较多,例如上一个时代:JQuery。框架源码中就有很多闭包函数的影子。
所以在日常开发中,闭包使用的频率不是很高,但不代表作为优秀的程序的我们可以不掌握。

闭包拓展包

为什么函数执行完毕,闭包函数还能访问函数的变量

在我们上一个游戏,生命控制设计的代码中,我们可以看到liveFun()函数执行完毕了。

按照作执行环境的设计理念,局部函数执行完毕后,会从环境栈中清出局部环境,并回收其局部函数中的变量和函数。

那不禁让人想问:为什么liveFun()函数执行完毕后,闭包函数还能访问liveFun()函数的live变量。

其实这是因为:在闭包中,会将包含函数(即外部函数)的活动对象(简单理解,就是外部函数的变量和方法)添加到它的作用域中。

因此,当liveFun()函数执行完毕后,其执行环境的作用域被销毁回收,但它的活动对象仍然留存在内存中,直到匿名函数被销毁后,liveFun()的活动对象才会被销毁。

关于闭包和变量

闭包只能取得包含函数(外部函数)中任何变量的最后一个值
先看下面的例子:

function fun(){
    var result=new Array();
    for(var i=0;i<10;i++){
        result[i]=function(){
            return i;
        }
    }
    return result;
}
var result=fun();
console.log(result[0]());   //为什么输出:10?

上面的代码,我们在for循环中给var result数组添加了一个闭包函数,闭包函数返回i的值。我们预期的结果是,restlt[0]()输出的结果应该是0,result[1]()的结果是1。以此类推。

但我们发现每个函数都返回10。这是为什么?

因为当fun()函数执行完毕后,存在活动对象中的i已经变成10,此时再去调用匿名函数,匿名函数访问活动变量中的值,当然都是10。

这样的情况经常出现在实际操作中,我们通过for循环给elements去设置onclick事件去输出对应位置的时候。我们发现不管点击哪个element,它输出都是循环中的最后一个值。

因此,我们可以通过以下立即执行函数进行改造,把i的值绑定在闭包函数内部。

function fun(){
    var result=new Array();
    for(var i=0;i<10;i++){
        result[i]=function(num){
            return function(){
                return num;
            }
        }(i)
    }
    return result;
}
var result=fun();
console.log(result[0]());   //输出:0
console.log(result[0]());   //输出:1

最后复盘:

1、闭包是指有权访问另一个函数作用域中的变量的函数
2、当包含函数执行完毕后,其执行环境的作用域被销毁回收,但它的活动对象仍然留存在内存中,直到匿名函数被销毁后,包含函数的活动对象才会被销毁。
3、闭包只能取得包含函数(外部函数)中任何变量的最后一个值
4、面试遇到闭包函数的问题深呼吸,冷静,想想大麦的文字。

我是大麦,如果喜欢我的文章请给我一个小心心哦。

GPMC开发笔记(TI开发者推荐笔记) 因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。 1.GPMC介绍 gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。 注意:在这种模式下gpmc_a[0]引脚是没法使用的 1.1GPMC信号线 阅读详情

相关推荐

从零到一:龙芯杯参赛全攻略(含北理工学长经验PDF、B站培训视频与开源代码合集)

本文详细介绍了龙芯杯全国大学生计算机系统能力大赛的参赛全攻略,包括资源整合、技能树构建、团队协作和避坑指南。提供北理工学长经验PDF、B站培训视频与开源代码合集,帮助参赛者从零基础到站上领奖台。重点解析如何高效获取优质资源、避开新手常见陷阱及构建可落地的学习路径,助力普通学生系统学习CPU设计。

weixin_26802933的博客 540

js闭包简单易懂版

js闭包简单易懂版一、变量的作用域二、如何从外部读取局部变量三、闭包的概念四、闭包的用途五、使用闭包的注意点六、思考题 一、变量的作用域 变量作用域分为两种:全局变量和局部变量 JS中函数内部可以直接读取全局变量 var n = 99; function F1 (){ console.log('n') } F1() // 99 在函数外部自然无法读取函数内的局部变量 function f1(){ var n = 99 a = 88 // 注意:函数内部声明变量的时候,一定要使用var等声明,否则实际

qq_45384585的博客 442

闲置服务器之代理服务器篇

这台服务器是在阿里云免费白嫖的,天工开物计划,阿里给的300块无门槛优惠券,买了一台新加坡的境外服务器,288,刚刚抵扣完,因为是境外服务器,能够访问一些国内不能访问的网站,所以本文章仅从技术的角度来搭建代理服务器,使用时,请自觉遵守国家相关规定,如有任何违法行为,与本人无任何关系!!!。本文使用tinyproxy来搭建代理服务器。

m0_50281408的博客 2104

js一分钟学会闭包

一.js闭包理解    闭包的三大特点为: 1、函数嵌套函数 2、内部函数可以访问外部函数的变量 3、参数和变量不会被回收。 好了闭包就学完了,就这么简单。   那么你一定很迷 接下来才是重点 常见的写法   1.    //第1种写法 function Circle(r) { this.r = r; }...

weixin_34270865的博客 109

SimpleFOC STM32实战:基于F103与HAL库,剖析速度环与电流环的协同控制

本文详细介绍了基于STM32F103与HAL库的SimpleFOC实战应用,重点剖析速度闭环控制与电流环的协同工作原理。通过开发环境搭建、参数调试技巧及性能优化方案,帮助开发者高效实现无刷电机精准控制,适用于机器人、无人机等高精度应用场景。

weixin_29170327的博客 476

Unity UGUI高斯模糊背景效果 简易解决方案

UnityUI背景模糊效果简易解决方案1.功能描述简易界面框架搭建合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 1.功能描述 在我们玩游戏的时候,经常会看到一些游戏会对UI做这样的处理: 可以看到,新开的上层UI界面会以下层UI界面的模糊

SaberZG的博客 1万+

js 【详解】闭包

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

朝阳39的博客 3万+

从虚拟机到双系统:手把手教你为Gromacs搭建最强Linux环境(含WSL2、Ubuntu22.04配置)

本文详细指导如何在Windows系统下为Gromacs分子动力学模拟搭建高性能Linux环境,涵盖WSL2和Ubuntu22.04双系统配置。通过对比虚拟机、WSL2和原生Linux的性能数据,提供GPU加速、内存优化等实用技巧,帮助科研人员提升计算效率。

weixin_30861797的博客 270

js之闭包(通俗、易懂)

闭包的知识点

m0_59722204的博客 934

Android13 SurfaceFlinger启动流程分析

在Android13版本中,SurfaceFlinger是由Android.bp去启动init.rc文件,然后再解析文件去加载SurfaceFlinger。上面方法主要处理如下:1、调用surfaceflinger的createSurfaceFlinger方法,实例化surfaceflinger。2、调用flinger(surfaceflinger)的init()方法,在客户端连接之前进行初始化。

liuning1985622的博客 1919

SerDes电路的PCB仿真设计规则及策略

SerDes的PCB设计中,重点工作是使用3D 电磁 (EM) 场求解器,进行过孔结构优化,包括 BGA的扇入和扇出区域以及布线的过孔区域,并且,利用连接器供应商提供加密的 3D 模型,进行连接器和 PCB 的级联仿真,最终获取系统级的通道性能参数,如插入损耗、回波损耗、串扰和模式转换、阻抗曲线等,如果发现任何缺陷,再进行进一步优化,这一过程中,推荐进行拆分仿真,以提高设计效率。

一只豌豆象的博客 2191

一文详解js闭包,初学者也能学会的闭包

变量的作用域分为全局作用域和局部作用域,也就是全局变量和局部变量。JavaScript有一个特殊的地方是函数内部可以直接读取全局变量,但是在函数外部,无法读取到函数内部的变量。对函数内部变量进行一系列操作之后,需要在函数外部访问到,怎么才能实现呢?这就需要使用闭包了。当一个嵌套的内部子函数引用了嵌套的外部父函数的变量(这个变量也可以是函数)时,闭包就产生了。

czjl6886的博客 839

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【JavaScript】一文了解JS的闭包

详解JavaScript的闭包使用及其日常开发遇到的常见问题

ztK63LrD的博客 4052

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

visio安装包

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

JavaScript — 闭包、闭包的作用、生命周期、自定义JS模块

目录 一、理解闭包 1.如何产生闭包? 2.闭包到底是什么? 3.产生闭包的条件? 4.常见的闭包 二、闭包的作用 三、闭包的生命周期 四、闭包的应用——自定义JS模块 五、闭包的缺点及解决 1.缺点 2.解决 一、理解闭包 1.如何产生闭包? 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包 2.闭包到底是什么? *使用chrome调试查看 *理解一:闭包是嵌套的内部函数(绝大部分人) *理解二:包含被引用变量(函数)的..

m0_59897687的博客 1130

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【JavaScript基础】深入了解JS的闭包

闭包是JS中一个重要的概念,也是面试中的重点,相信大家在面试中都会碰到这样的几个问题: 1. 请你说说什么是闭包? 2. 请你说说闭包有哪些应用? 3. 请你说说闭包有哪些优缺点? 大家都是怎么回答这几个问题的呢?在网上的文章中对闭包的概念都有不同的说法,导致很多人对闭包没有一个清晰的概念,接下来就和我一起探究什么是闭包。 首先...

weixin_41531446的博客 349

js javascript 前端 闭包

文章目录一、前言二、案例1. 函数闭包2. 对象闭包3. 缓存案例4. 沙箱5. 经典案例 参考资料: 菜鸟教程 博客1 一、前言 闭包指能够读取其他函数内部变量的函数。 二、案例 1. 函数闭包 function a(){ var num=1; function b(){ num++; cosole.info(num); } } 2. 对象闭包 function e(){ va...

helloWorldAndYou的博客 250

js闭包作用问题解决应用,javascript中闭包的定义

当 JavaScript 引擎在 Foo 作用域中没有找到 a 时,它会首先从 Foo 作用域的父作用域,也就是 Bar 作用域中寻找 a,它确实找到了 a。这里需要注意的是,increase1和increase2是通过不同的函数调用createCounter创建的,它们不共享内存,它们的i是独立的,不同的。If Scope 声明了自己的计数,所以我们在这个作用域中使用的计数就是当前作用域的计数。

2301_79533350的博客 731

javascript深入理解js闭包

javascript深入理解js闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

记事本 3745

js 点击闭包_JavaScript 闭包的应用

前言面试问题:说一下对变量提升的理解说明this的几种不同的使用场景创建10个<a>标签,点击的时候弹出来对应的序号如何理解作用域实际开发中闭包的应用涉及到的知识点:执行上下文this作用域作用域链闭包执行上下文执行上下文主要有两种情况:全局代码: 一段<script>标签里,有一个全局的执行上下文。所做的事情是:变量定义、函数声明函数代码:每个函数里有一个上下文。所做的事...

weixin_28709649的博客 135

js 点击闭包_JavaScript闭包应用介绍

来源 |https://www.zoo.team/article/vue3-jsx本文介绍一下js中的一个重要概念——闭包。其实即便是最初级的前端开发人员,应该都已经接触过它。一、闭包的概念和特性首先看个闭包的例子:function makeFab () { let last = 1, current = 1 return function inner() { [curren...

weixin_39656686的博客 115

闭包js闭包javaScript闭包es5闭包

es5作用域:全局作用域 + 函数级别作用域 闭包:一个函数内部的函数叫做闭包。相当于函数内部与外界连接的桥梁。 闭包解决的问题:a 帮助函数外部读取函数级别作用域中的变量 而存在。b 变量的值始终保存在内存中。 不能滥用闭包:闭包会使函数中的变量始终保存在内存中,内存消耗大,滥用闭包会对网页性能有影响。 2.7 闭包–解决循环变量问题 2.8 闭包中的this 闭包中的this默认情况下指向window.........

angrynouse的博客 269

【Javascript】Js闭包

同时f2是f1的局部方法,f2在内存中导致f1也始终在内存中。因为f2同样在f1方法内部,所以f1的内部所有变量对f2都是可见的,这时只要把f2作为返回值,我们就可以在f1外部读取到f1的局部变量。注意:f1中局部变量对f2是可见的,但是f2中局部变量对f1则是不可见的。官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。

小罗的博客 643

js 闭包传参_JavaScript 闭包图文解析

什么是闭包?我们来看看 MDN上的解释:Aclosureis the combination of a function bundled together (enclosed) with references to its surrounding state (thelexical environment). In other words, a closure gives you acce...

weixin_29508487的博客 202

js 闭包传参_javascript深入理解js闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。var n=999;function f1(){alert(n);}f1(); // 999另一方面...

weixin_26849971的博客 701

java script 闭包_JavaScript之闭包

第一部分:基本概念我们知道根据作用域链的规则,一个函数是不能访问到在与他同一个作用域内的函数内的内部变量的,如下所示:function foo() {var a = 5;console.log(a);}foo();function bar() {var b = a + 5;console.log(b);}bar();在执行到第二个函数时,由于找不到a,所以会报错: a is not defined...

weixin_39944638的博客 162

js闭包循环原因_javascript与闭包

定义闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。作用一、 存储变量闭包可以保存外部函数的变量,内部函数保留了对外部函数的活动变量的引用,所以变量不会被释放。可以用在把一些不经常变动计算起来又比较复杂的值保存起来,节省每次的访问时间。示例:f...

weixin_39804329的博客 245
上一篇: 微信小程序canvas 实现信用图表
下一篇: [JS]大话执行环境和作用域链
VikcyWinner
博客等级 码龄11年 12粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值