博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入解析Javascript闭包
阅读量:6159 次
发布时间:2019-06-21

本文共 1412 字,大约阅读时间需要 4 分钟。

首先给个例子:

function PfnOuter(){    var num=999;    function PfnInner(){        alert(num);    }    return PfnInner;}var test=PfnOuter();test();        //999
View Code

上述实例中PfnInner函数就是闭包,闭包简单的理解就是能够读取其它函数内部变量的函数。由于Javascript中只有函数内部的子函数才能读取函数内部的变量,因此闭包也可以简单的理解成定义在一个函数内部的函数,闭包就是将函数内部和函数外部链接起来的一座桥梁。

闭包有2大主要的作用:一是可以读取函数内部的变量,二是可以让这些变量一直保存在内存中。再举一个例子:

function PfnOut(){    var num=999;    nAdd(){        num++;    }    function PfnInner(){        alert(num);    }    return PfnInner;}var test=PfnOuter();test();        //999nAdd();test();        //1000
View Code

test实际上就是闭包函数PfnInner,它一共运行了2次,第一次是999,第二次是1000;这个足以证明num一直存在内存中,并没有在PfnInner函数调用完成之后给释放,这就可以实现类似C++中的静态变量。

让我们对其中的原理进行深入的解析,PfnOuter是PfnInner的父函数,而PfnInner赋值给一个全局变量,这导致PfnInner一直在内存中,而PfnInner又依赖于PfnOuter,因此PfnOuter也一直在内存中,不会被回收。

还有一个值得注意的,在Javascript中如果声明局部变量,需要var关键之,否则认为该变量是一个全局变量,因此,上述代码中的nAdd就是一个全局的变量,nAdd的值是一个匿名函数,而这个匿名函数的本身就是一个闭包,所以nAdd可以在函数外部对函数的变量进行操作。

显然,使用闭包需要有几点注意的地方:

1.滥用闭包造成内存无法释放,在IE中很容易造成内存泄露,解决方法是在函数退出是将不使用的变量给全部删除,也就是将不需要的变量赋值为null;
2.闭包函数会在父函数外部修改父函数内部的变量,所以如果吧父函数当做对象使用,把闭包当做共有方法使用,把父函数内部的变量当做私有变量时一定要注意要随随便便调用闭包函数修改内部变量。 

总结一下闭包:

当内部函数 在定义它的作用域的外部被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们。

在以上谈到闭包的时候,提到了Javascript内存泄露,接下来简单讲述一下Javascript的内存释放,在Javascript中一个对象不比其他地方引用[比如将该对象赋值为null],垃圾回收期会回收该变量,如果2个对象相互引用,比如闭包的关系,若这2个变量不被其他地方引用,则这2个变量对象均被释放。

 

转载于:https://www.cnblogs.com/chengbing2011/p/4143961.html

你可能感兴趣的文章
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>
老男孩教育每日一题-第107天-简述你对***的理解,常见的有哪几种?
查看>>
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
Spring常用注解
查看>>
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
数据库之MySQL
查看>>
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>