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)
网站制作价目表怎么做,珍爱网婚介费用多少?

