javascript中闭包概念与用法深入理解

发布时间 - 2026-01-10 21:50:54    点击率:

本文实例分析了javascript中闭包概念与用法。分享给大家供大家参考,具体如下:

1.问题的引出,什么时候会遇到闭包?

首先因为JS是没有块状作用域的,但是有函数作用域即函数作为了局部变量之间的界限,不同函数内的局部变量具有独立性,

因为JS没有块状作用域,笔者初学JS时,在事件的监听时,因为不理解JS中局部变量的作用域,犯过不少错误!

(1)JS中的变量作用域

for(var i=0;i<9;i++)
{
}
alert(i) //输出9

我们发现,虽然变量i是块状区域for()内的一个局部变量,但是我们在块级作用域for()外,依然可以得到变量i

(2)JS中的函数作用域

function abc(){
 var a=1;
}
abc();
alert(a);// 会报错,a is not defined

我们发现,在函数外调用函数后,在函数外是无法取到函数里的变量

总结:通过(1),(2),我们加深了对JS中,没有块级作用域只有函数作用域的理解!

举例:如果现在例1:

var a=1
function abc(){
 var a=2;
}
abc();
alert(a) // a=1

特别注意如果例2:

var a=1
function abc(){
a=2;
alert(a);
}
abc();//a=2

对比例1,不同之处在于例2,中 是“a=2"而不是”var a=2“

区别在于如果是var a,则表示在函数中定义变量a,如果是没有变量声明,如果直接a,则表示在全局变量中定义变量a;

2.如果引用函数内部的变量?

由1可知,JS中只存在函数作用域,那么我们如何才能在拿到函数中定义的变量呢?

根据JS的语法规则:内部函数(或者内部对象)中,可以访问外部函数中的变量。

什么意思呢?举例说明例1:

function abc(){
 var a=1;
 !function(){
 alert(a)
} ()
} //此时不会报错,a=1

再举一个例子(内部对象的例子)例2:

var o={
 a=1,
 myfun:function(){
 return this.a
}
}

则alert(o.myfun())得到的值为1,现在我们大概了解了如何访问函数(或者对象,其实函数的本身也是对象)中的变量!

3.什么是闭包?

我的理解就定义在一个函数内部的函数!

闭包是函数内部与外部之间的桥梁!

即内部函数在定义它的外部使用时,就创建了一个闭包!

我们知道,一般情况下,当函数被调用完,内存会被释放,但是应用于函数闭包比如

function abc1(){
 var a=1;
function abc2(){
 a++;
}
return abc2()
}

当我们调用abc1()函数后,因为abc1函数的中又调用了abc2()函数,因此函数abc1()中的变量在子函数中被调用,所以在父函数abc1()调用结束后

变量a的内存空间并不会被释放!

为什么GC机制无法回收abc1()函数中的变量a,  因为首先我们在全局中调用了函数abc1(),我们设全局对象为c,abc1()对象为b,同时我们在对象b

即函数abc1()中又调用了函数abc2(),设abc2(0为a。

再次理解这种关系    c中调用了b,b中又调用了a,JS中规定当a,b对象两两互相引用,并且a,b中又有一个被a,b函数之外的对象c引用时,GC机制不执行垃圾回收(变量清空)!

由此我们引出了闭包的重要作用:

如果内部函数在其外部被调用,则会产生闭包,闭包用于保存某些变量的值,不会被垃圾回收机制回收!

4.闭包的缺点

因为使用闭包后,某些变量会在函数调用之后持续的保持在内存中,因此滥用闭包会导致内存泄漏!

5.扩展应用,加深对于闭包的理解!

var o={
 a:1;
myfunc:function(){
return function(){
 return this.a;
}
}
alert(o.myfunc()()); // a is not defined
}

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》及《JavaScript遍历算法与技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。


# javascript  # 闭包  # javascript中的闭包概念与用法实践分析  # JavaScript作用域、闭包、对象与原型链概念及用法实例总结  # javascript闭包概念简单解析(推荐)  # jquery闭包概念分析  # Javascript的独特的概念之闭包  # 中又  # 报错  # 相关内容  # 什么时候  # 遍历  # 会在  # 感兴趣  # 数据结构  # 给大家  # 应用于  # 当我们  # 可以得到  # 更多关于  # 什么意思  # 重要作用  # 则会  # 所述  # 不理解  # 程序设计  # 值为 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: linux top下的 minerd 木马清除方法  Laravel如何使用Eloquent进行子查询  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  青岛网站建设如何选择本地服务器?  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  如何彻底卸载建站之星软件?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  详解Android——蓝牙技术 带你实现终端间数据传输  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  JS弹性运动实现方法分析  JavaScript数据类型有哪些_如何准确判断一个变量的类型  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何用好域名打造高点击率的自主建站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Swift中switch语句区间和元组模式匹配  高防服务器如何保障网站安全无虞?  Laravel怎么使用artisan命令缓存配置和视图  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Python并发异常传播_错误处理解析【教程】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  详解vue.js组件化开发实践  如何用y主机助手快速搭建网站?  如何快速搭建二级域名独立网站?  5种Android数据存储方式汇总  浅谈redis在项目中的应用  如何用美橙互联一键搭建多站合一网站?  WEB开发之注册页面验证码倒计时代码的实现  高端企业智能建站程序:SEO优化与响应式模板定制开发  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何在建站宝盒中设置产品搜索功能?  利用python获取某年中每个月的第一天和最后一天  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  三星、SK海力士获美批准:可向中国出口芯片制造设备  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  C语言设计一个闪闪的圣诞树  java中使用zxing批量生成二维码立牌  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  EditPlus中的正则表达式实战(6)  网站制作价目表怎么做,珍爱网婚介费用多少?