JavaScript 闭包初步

SonarQube 7.9 部署与Java扫描实战:老旧系统静态分析落地指南 静态代码分析是保障遗留系统质量的关键技术手段,其核心在于工具链与运行环境的精准匹配。SonarQube 作为工业级SAST平台,通过规则引擎(如FindBugs/SpotBugs、PMD、Checkstyle)实现对代码缺陷、安全漏洞和可维护性问题的自动化识别。SonarQube 7.9虽非最新版,但凭借对Java 6/7原生支持、H2嵌入式数据库轻量部署、以及与Jenkins/GitLab等传统CI工具的深度兼容,成为金融、制造、教育等领域存量系统的首选方案。它不依赖Kubernetes或云原生基础设施, 阅读详情

JavaScript 闭包初步


内部类

我们先从一个基本的内部类开始

function outerFn() {
    document.write("Outer function<br/>");
    function innerFn() {
        document.write("Inner function<br/>");
    }
}

假如我们想在outerFn()外调用innerFn()肿么办

function outerFn() {
    document.write("Outer function<br/>");
    function innerFn() {
        document.write("Inner function<br/>");
    }
}
innerFn();

上面的代码会出现JavaScript错误,那么该怎么调用呢?

伟大的逃逸

JavaScript允许开发人员像传递任何类型的数据一样传递函数,也就是说,JavaScript中的内部函数能够逃脱定义他们的外部函数。

逃逸方式一
var globalVar;
function outerFn() {
    document.write("Outer function<br/>");          
    function innerFn() {
        document.write("Inner function<br/>");
    }
    globalVar = innerFn;
}
outerFn();
globalVar();

这种逃逸方式是:内部函数指定给一个全局变量

逃逸方式二
function outerFn() {
    document.write("Outer function<br/>");
    function innerFn() {
        document.write("Inner function<br/>");
    }
    return innerFn;
}
var fnRef = outerFn();
fnRef();

这种逃逸方式是:通过在父函数的返回值来获得内部函数引用。

这种即使离开函数作用域的情况下仍然能够通过引用调用内部函数,意味着只要存在调用内部函数的可能,JavaScript就需要保留被引用的函数。而且JavaScript运行时需要跟踪引用这个内部函数的所有变量,直到最后一个变量废弃,JavaScript的垃圾收集器才能释放相应的内存空间.

闭包特性

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

闭包的特性:

  • 内部函数 也可以有自己的变量,这些变量都被限制在内部函数的作用域中。
function outerFn() {
    document.write("Outer function<br/>");
    function innerFn() {
        var innerVar = 0;
        innerVar++;
        document.write("Inner function\t");
        document.write("innerVar = "+innerVar+"<br/>");
    }
    return innerFn;
}
var fnRef = outerFn();
fnRef();
fnRef();
var fnRef2 = outerFn();
fnRef2();
fnRef2();

运行结果:

Outer function
Inner function innerVar = 1
Inner function innerVar = 1
Outer function
Inner function innerVar = 1
Inner function innerVar = 1

  • 内部函数也可以像其他函数一样引用全局变量:
var globalVar = 0;
        function outerFn() {
    document.write("Outer function<br/>");
    function innerFn() {
        globalVar++;
        document.write("Inner function\t");
        document.write("globalVar = " + globalVar + "<br/>");
    }
    return innerFn;
}
var fnRef = outerFn();
fnRef();
fnRef();
var fnRef2 = outerFn();
fnRef2();
fnRef2();

运行结果:

Outer function
Inner function globalVar = 1
Inner function globalVar = 2
Outer function
Inner function globalVar = 3
Inner function globalVar = 4

  • 父函数的局部变量被内部类引用(有兴趣可以了解一下作用域链和活动对象的知识)

    function outerFn() {
    var outerVar = 0;
    document.write("Outer function<br/>");
    function innerFn() {
        outerVar++;
        document.write("Inner function\t");
        document.write("outerVar = " + outerVar + "<br/>");
    }
    return innerFn;
    }
    var fnRef = outerFn();
    fnRef();
    fnRef();
    var fnRef2 = outerFn();
    fnRef2();
    fnRef2();

    这一次结果非常有意思,也许或出乎我们的意料

    Outer function
    Inner function outerVar = 1
    Inner function outerVar = 2
    Outer function
    Inner function outerVar = 1
    Inner function outerVar = 2

我们看到的是前面两种情况合成的效果,通过每个引用调用innerFn都会独立的递增outerVar。也就是说第二次调用outerFn没有继续沿用outerVar的值,而是在第二次函数调用的作用域创建并绑定了一个一个新的outerVar实例,两个计数器完全无关。

闭包的交互

 function outerFn() {
    var outerVar = 0;
    document.write("Outer function<br/>");
    function innerFn1() {
        outerVar++;
        document.write("Inner function 1\t");
        document.write("outerVar = " + outerVar + "<br/>");
    }

    function innerFn2() {
        outerVar += 2;
        document.write("Inner function 2\t");
        document.write("outerVar = " + outerVar + "<br/>");
    }
    return { "fn1": innerFn1, "fn2": innerFn2 };
}
var fnRef = outerFn();
fnRef.fn1();
fnRef.fn2();
fnRef.fn1();
var fnRef2 = outerFn();
fnRef2.fn1();
fnRef2.fn2();
fnRef2.fn1();

运行结果:

Outer function
Inner function 1 outerVar = 1
Inner function 2 outerVar = 3
Inner function 1 outerVar = 4
Outer function
Inner function 1 outerVar = 1
Inner function 2 outerVar = 3
Inner function 1 outerVar = 4

innerFn1和innerFn2引用了同一个局部变量,因此他们共享一个封闭环境。当innerFn1为outerVar递增一时,就为innerFn2设置了outerVar的新的起点值,反之亦然。我们也看到对outerFn的后续调用还会创建这些闭包的新实例,同时也会创建新的封闭环境,本质上是创建了一个新对象,自由变量就是这个对象的实例变量,而闭包就是这个对象的实例方法,而且这些变量也是私有的,因为不能在封装它们的作用域外部直接引用这些变量,从而确保了了面向对象数据的专有性。

看完上面的基本知识,你或许对闭包有了一个比较浅显的认识,学过C/C++的同学应该理解起来比较容易,因为闭包特别像是指针函数,但是有不是完全是,因为还有作用域的概念。如果想更深入的认识闭包可以进一步学习JavaScript作用域链和活动对象。

本文转自:http://www.cnblogs.com/dolphinX/archive/2012/09/29/2708763.html 部分内容做了修改,特此说明。

告别玄学调参:手把手教你用20元件模型搞定GaN HEMT高频仿真(附S参数提取避坑指南) 本文详细介绍了如何使用20元件模型优化GaN HEMT高频仿真,解决传统16元件模型在10GHz以上频段的误差问题。通过S参数提取避坑指南和实战案例,帮助工程师精准建模分布式电极效应和寄生反馈路径,提升射频电路设计效率。 阅读详情

相关推荐

华为擎云W515 PGUV-WBY0安装银河麒麟V10全流程解析

本文详细解析了华为擎云W515 PGUV-WBY0安装银河麒麟V10系统的全流程,包括准备工作、镜像下载与校验、启动盘制作、BIOS设置、安装过程关键选择、系统初始化及常见问题排查。特别针对ARM架构设备提供了实用技巧,帮助用户顺利完成国产化系统的部署与优化。

weixin_28725949的博客 698

js闭包之初步理解( JavaScript closure)

闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解。 要理解闭包,肯定是要先了解js的一个重要特性,回想一下,那就是函数作用域,作用域分全局和局部,由于作用域链的存在,全局变量能在任何地方被访问到,相反,局部变 量只能在局部访问,而无法在全局的作用域中被访问。因为如果你想访问某个局部变量,首先搜索当前作用域...

weixin_30567471的博客 134

Docker 安装 CentOS7

本文主要介绍了docker 下安装centos7。访问 CentOS 镜像库地址:https://hub.docker.com/_/centos?tab=tags&page=1。可以通过 Sort by 查看其他版本的 CentOS 。默认是最新版本 centos:latest 。 使用以下命令来查看是否已安装了 centos7: 启动centos容器,并把docker上centos的22端口映射到本机60001端口(端口号可以自己指定) 3、进入到Centos容器 4.安装ssh服务和网络必须软件

折腾java的博客 1万+

js闭包初步认识

1】定义 闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量 2】作用 a、够访问其他函数的作用域中的变量 b、让这些变量的值始终保持在内存中,不会因为调用后被自动清除 3】常见的结构(function内嵌一个带return的function) 闭包有时候不一定带return的 4】闭包的优点(应用场景) a、可以读取函数内部的变量 b、让这些变量的值始终保持在内存中,不会在f1(父函数...

深夜代码酒神 326

深入剖析:NAND Flash与SD NAND(贴片式SD卡)存储扇区分配表架构差异与优化策略

本文深入探讨了NAND Flash与SD NAND(贴片式SD卡)在存储技术中的架构差异及其优化策略。NAND Flash作为非易失性存储器,依赖主控芯片进行坏块管理和磨损均衡,而SD NAND则通过内置控制器和标准文件系统(如FAT)简化了存储管理。两者在写入性能、容量扩展和可靠性方面各有优劣,NAND Flash需通过磨损均衡和写入合并优化性能,而SD NAND则通过高容量和高速传输提升效率。文章为嵌入式系统开发者和硬件工程师提供了关于如何根据需求选择并优化存储介质的参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1238

LMI线性矩阵不等式之非线性变量处理

​ 如果一个LMI线性矩阵不等式中的某项存在两个矩阵变量相乘,那么称该类情形为非线性矩阵不等式,而要直接求解时很困难的,而且LMI工具箱也无法求解非线性矩阵,所以需要通过变量替换法进行处理。 ​...

Mr.邹的博客 4550

js闭包的初步学习

闭包是一个辨别前端开发人员是老司机还是萌新的考点之一。今天就和大家一起来学习一下什么是闭包。 一、了解闭包的模型 刚开始学习闭包,我们需要知道它长的是什么样子,看以前有没有接触过。这就像昨天老妈和我说隔壁小伙真帅一样。我的第一反应是啥样啊,然后想想以前是否遇见过。以下就是闭包的样子。 官方的定义就是函数...

weixin_44395929的博客 1431

Cherry Studio 新手必看:5分钟搞定MCP服务器配置(附常见问题解决)

本文为Cherry Studio新手提供了详细的MCP服务器配置指南。文章从核心概念入手,解释了Cherry Studio作为MCP客户端如何通过MCP协议安全、标准化地扩展AI助手能力。重点讲解了uv和Bun环境的安装与常见网络问题的解决方案,并演示了如何添加首个MCP服务器(如mcp-server-fetch),助你快速构建可扩展的智能工作流。

corn8的博客 595

初步了解javascript闭包

 最近想要了解下javascript闭包,就在网上找了些资料看,发现这个讲的还挺清晰的,就转过来备忘吧^_^

duran1986的专栏 808

别再纠结了!手把手教你根据项目需求选对目标检测框架(MMDetection/Detectron2/YOLOv8实战对比)

本文详细对比了三大目标检测框架MMDetection、Detectron2和YOLOv8的适用场景与实战技巧,帮助开发者根据项目需求精准选型。从毕业设计到工业落地,分析不同场景下的核心需求与框架优势,提供决策树和避坑指南,确保技术选型与项目目标高度匹配。

weixin_30342209的博客 554

[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望

杨秀璋的专栏 2万+

初步了解Javascript 闭包

这段时间在学习Javascript,在过程中记录下一些知识点,以便以后回顾和帮助一些初学的朋友,要是有大神能给提点建议就最好了。 初识闭包 闭包的作用 初识闭包 闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。 —— [ 百度百科 ] 上面的这个定义来自百度百科,看完之后其实你还是不知道

阳光之线 619

医图论文 Arxiv‘24 | 自我先验引导的 Mamba-UNet 网络在医学图像超分辨率中的应用

作者提出了一种自我先验引导的 Mamba-UNet 网络(简称 SMamba-UNet)用于医学图像超分辨率。现有方法主要基于卷积神经网络(CNNs)或 Transformer。基于 CNN 的方法无法捕捉长距离依赖关系,而基于 Transformer 的方法由于其二阶计算复杂度,面临沉重的计算挑战。最近,状态空间模型(SSMs)尤其是 Mamba 出现了,它能够以线性计算复杂度建模长距离依赖。

小白学视觉 262

JavaScript 初步闭包理解

JavaScript 初步闭包理解

前端博客 467

温度PID控制PLC程序

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

javascript之初步理解闭包

错误的闭包:函数中嵌套函数。这种说法不完成,所以错误。 真正的闭包:当一个函数,在不是创建它的环境中调用时,它就是一个闭包。闭包会记住它所创建的环境中任何一个变量的最后一个值。(在循环迭代时候经常碰到) 闭包的使用场合:1、js中的事件驱动绑定事件,当事件绑定的函数不以匿名函数而以函数名的形式绑定的时候。(在jquery中,已经写好可以传入回调函数参数的方法) 2、模拟私有方

m0_37986789的博客 327

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Javascript闭包(Closure)初步接触

转载自:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种...

183

SAP B1中文培訓教材_SDK

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

js 初步了解闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全

小九的博客 294

javaScript闭包问题初步总结(一)

产生场景:当内部函数被保存到外部时,将会生成闭包; 缺点:闭包会导致原有作用域链不释放,造成内存泄漏。(占用空间); 作用: 可以实现公有变量  eg:函数累加器 function add(){ var count=0; return function addS(){ count++; console.log(count); } ...

shuoSmallWhite的博客 261

JS笔记(5) 闭包初步理解

闭包: 函数套函数,子函数使用父函数的参数或者变量 并且子函数被外界所引用,此时父级形成闭包环境 父级的参数或者变量不被浏览器垃圾回收机制回收. 此时,打印父函数的返回值,有个属性为Scopes Scopes下有个closure的属性,closure 就是闭包。 使用闭包可以一直存储父级的参数或者变量 不被外界的函数或者变量所干扰(污染) funct...

weixin_34232363的博客 120

五分钟带你学会 JavaScript 闭包

闭包,是javascript中独有的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它。因此,本文不会对闭包的概念进行大篇幅描述,直接上干货,让你分分钟学会闭包! 1 闭包–爱的初体验 在接触一个新技术的时候,我首先会做的一件事就是:找它的demo code。对于码农们来说,代码有时候比自然语言更能理解一个事物。 其实,闭包无处...

weixin_44526331的博客 515

【JavaScript】一文了解JS的闭包

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

ztK63LrD的博客 4053

JavaScript中的闭包

JavaScript中的闭包

qq_44482048的博客 6424

javascript深入理解js闭包

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

记事本 3746
上一篇: String 算法
下一篇: Java 序列化
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值