深入理解 javascript 闭包


prtyaa
prtyaa 2023-12-26 17:06:14 51290
分类专栏: 资讯

前言

闭包作为JS中的一大难点,相信许多小伙伴也常常为此疑惑,闭包到底是什么?它有什么用呢?这是面试必问的东西

变量和作用域

说闭包之前必须要清楚的知道 javascript 中的 变量和作用域的概念,这里就不详细讲作用域了。

var a=20;
function fn(){
    var sum=0;
    alert(a);//20   局部访问全局
}
fn()//先执行
alert(sum)//报错  全局访问局部
动图封面
 

上面这个例子我们可以看到作用域的特点:局部可以访问全局的变量,但全局不能访问局部的变量

闭包简介

JS中的闭包设计,是一种设计思想,其主要目的是保证一个函数内部的变量既可以得到重用,又不被污染(不会被随意篡改)。

概念:闭包就是能够读取其他函数内部变量的函数。写在另一个函数内部的函数 。

function global(){
	var num = 10;
	function local(){
		alert(num);
	}
	return local;
}
var demo = global();
demo() // 10 闭包;

这就是一个经典的闭包案例,我们在 global 函数内部定义其子函数 local ,并将其作为 global 的返回值,因为 local 函数作用域可以访问 global 的作用域,所以实现了从全局作用域访问 global 函数作用域的效果。

闭包打破了作用域链的规则,可以访问函数内部的变量或者方法

闭包的原理

利用js中的垃圾回收机制,在回收被销毁的变量和函数时,如果发现被销毁的变量的函数正在被另一个函数使用,那么使用中的变量和函数将不被释放,长期驻留在内存中,直到整个程序退出时才被释放。

什么是垃圾回收机制呢?

垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存,但这个过程不是时时的,因为其开销比较大,所以垃圾回收器会按照固定时间间隔周期性的执行

当函数内部的变量或者方法在全局被引用的时候,当前函数就不会被垃圾回收机制所回收

function global(num){
	return function(){
		alert(++num)
	}
}
var demo = global(1);
demo() //2
demo() //3
demo() //4
动图封面
 

这里可以看到,闭包的使用,函数调用之后,让其外层函数的内部变量( global 函数内的变量)始终保存在了内存中,而不会被回收。使得每次调用 global 会让 num 加 1

这里要注意的是,每次调用一次 global,都会生成一个新的闭包,都会在内存中保存下其外层函数的内部变量。因此要注意闭包的使用,否则会导致性能问题。

总结

闭包打破了作用域链的规则,可以访问函数内部的变量或者方法
当函数内部的变量或者方法在全局被引用的时候,当前函数就不会被垃圾回收机制所回收

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=30895
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2966
【软件正版化】软件正版化工作要点  2885
统信UOS试玩黑神话:悟空  2855
信刻光盘安全隔离与信息交换系统  2743
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1277
grub引导程序无法找到指定设备和分区  1244
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  169
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  168
点击报名 | 京东2025校招进校行程预告  164
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  161
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!