专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

如果再有人问你闭包的问题,请你把这篇文章甩给他

ins518 2024-10-04 23:59:17 技术文章 13 ℃ 0 评论

对于一个前端开发者而言,闭包是面试过程中绕不过的一个高频知识点。接下来我们就来聊聊js闭包。

闭包的概念

【js闭包是一个拥有多个变量和绑定了这些变量的环境的表达式】这是官方的解释。好像有些晦涩难懂。

我来通俗的解释下【闭包】。就是有一个函数 makeFunc() 。在其里面定义了一个或多个变量。这个函数返回一个新的函数 displayName,新的函数 displayName 对外层的变量有引用关系。举个例子:

function makeFunc() {
 var name = '畅哥';
 function displayName() {
 alert(name);
 }
 return displayName;
}
var myFunc = makeFunc();

分析这段代码之前,我们不得不聊聊JS中的垃圾回收(GC)机制。

垃圾回收

即JS中的对象如果没有被其它对象所引用,那么这个对象会被做垃圾收回。js中的垃圾回收是自动的,一般不需要开发者来处理 (当然开发者也可以手动做垃圾回收)。通俗来讲,就是我们的JS变量是需要占用我们的计算机内存空间的,而垃圾回收则是【释放内存】,从而保证计算机资源高效应用。

知道了垃圾回收的概念,我们再来分析上面的代码。 makeFunc()函数里面有一个局部变量name ,一般来说,当makeFunc函数调用完以后,name变量会做垃圾回收。但是我们可以看到在函数里面又有一个displayName函数,并且在内部调用了alert(name);很显然,name变量已经被另外一个变量所引用。所以makeFunc调用完成以后 name变量不会被释放而一直在内存当中,会返回一个新的函数 displayName ,这样就形成了一个闭包。

当然,我们也可以这样理解,如果访问一个函数内部的局部变量?出于种种原因,我们有时候需要得到函数内的局部变量。但是,正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。继续举例:

counter函数中有一个默认值为0的count变量,当counter函数调用完成之后,变量count被没有被销毁,而是一直在内存中驻留。从后面继续调用c()可以看出,count还在累加。

闭包的应用

1、解决变量提升的问题。我们知道,用var定义变量存在变量提升问题。我们就可以用闭包来解决这个问题。当然 let 另当别论了。

2、避免全局污染

(function(){
	 var name = '';
})();

闭包的特点及注意事项

1、作为一个函数变量的一个引用,当函数返回时,其处于激活状态,一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

2、闭包允许使用内部函数,这些内部函数可以访问它们所在的外部函数中声明的参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。

3、闭包中的变量不会被释放一直保存的内存中导致对内存的资源消耗很大,所以它可能造成内存泄露的问题。要注意合理的运用。及时手动释放资源。

(全文完)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表