Java入门到架构师教程之什么是JavaScript闭包、闭包的作用、闭包的好处和坏处


1、闭包

每次看到jQuery的时候,首先想到的就是闭包。这是个常谈的问题了。今天重新回忆了一下闭包。

什么是闭包? 当有一个函数想要访问另一个函数内部的变量,这个是访问不了的。所有我们要用闭包来访问。所以简单的来说,闭包就是连接函数内部和外部的一座桥梁,通过闭包我们能够访问其他函数内部的变量。

1.1 作用域

想了解闭包,首先要知道作用域。最简单来说:全局变量和局部变量。

全局变量(Global variable):可以在脚本的任何位置被引用。

局部变量(Local variable):只存在于声明它的那个函数的内部,这个函数之外是无法引用的。

使用var声明的变量在当前作用域里面才起作用,未使用var申明的变量,不管在任何地方声明的,都是全局变量。用var声明的变量不一定是局部变量

1.2 闭包的作用

闭包最大的作用就是全局变量私有化。在上面讲过闭包能够访问其他函数内部的变量,还有一个就是能后永久的把一个变量保存在当前作用域中。不会随着函数调用完之后会被JavaScript特有的垃圾回收机制回收。

2、闭包案例

本文我们以闭包两种的主要形式来学习。

2.1 函数作为返回值

在这段代码中,a()中的返回值是一个匿名函数,这个函数在a()作用域内部,所以它可以获取a()作用域下变量name的值,将这个值作为返回值赋给全局作用域下的变量b,实现了在全局变量下获取到局部变量中的变量的值。

2.2 再来看一个闭包的经典案例

一般情况下,在函数fn执行完后,就应该连同它里面的变量一同被销毁,但是在这个例子中,匿名函数作为fn的返回值被赋值给了fn1,这时候相当于fn1=function(){var n = 0 ... },并且匿名函数内部引用着fn里的变量num,所以变量num无法被销毁,而变量n是每次被调用时新创建的,所以每次fn1执行完后它就把属于自己的变量连同自己一起销毁,于是乎最后就剩下孤零零的num,于是这里就产生了内存消耗的问题。

3、闭包的好处和坏处

3.1 好处

  • 保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突;
  • 在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存);
  • 匿名自执行函数可以减少内存消耗。

3.2 坏处

  • 其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
  • 其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响。
  • 学习完整体系全新Java入门架构师、全栈开发课程请私信我或者看图片联系。