javascript闭包简单的理解

浅谈js闭包

概念:简单地说,闭包就是在函数的内部声明的函数(即可理解为闭包就是innerFn函数)。

闭包本质:闭包的本质就是可以让函数(innerFn)外部作用域访问到在函数(innerFn)声明时所在作用域中的所有变量以及其他函数。闭包是将函数内部和函数外部链接起来的桥梁。
先看一段代码:
在这里插入图片描述
从上面的代码可以看出js都有一个特性特性,局部方法可以访问外部父类方法的属性,也就是说,子类或子方法可以访问父类的资源。

再看一段代码:
在这里插入图片描述
为什么我们打印出来的是undefined?因为子方法的变量作用域仅仅是子方法的范围,外部是无法获取到的。那么js中是如何获取字方法里面的值呢?我们来看下面的代码:
在这里插入图片描述
在这里插入图片描述
在外部无法获取到funOne内部的局部变量,但是funOne内部的局部方法funTwo却可以获取到,因此 返回一个funTwo的引用,这样在外部通过这个funTwo就可以获取到funOne的内部变量。而这个方法内的局部方法funTwo就叫做闭包。简单的总结下有权访问另一个函数作用域内变量的函数都是闭包。

为什么要用闭包?

闭包可以用在许多地方。它的最大用处有两个,一个是前面说到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在funOne调用后被自动清除。

为什么会这样呢?原因就在于funOne是funTwo的父函数,而funTwo被赋给了一个全局变量,这导致funTwo始终在内存中,而funTwo的存在依赖于funOne,因此funOne也始终在内存中,不会在调用结束后,被回收。好比一个餐厅,盘子总是有限的,所以服务员会去巡台回收空盘子,但还装着菜的盘子他怎么敢收?

注意!!
(1) 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

(2) 闭包会在父函数外部,改变父函数内部变量的值。所以,,不要随便改变父函数内部变量的值。

常见缺陷:
函数带()才是执行函数单纯的一句 var myname =funOne; 是不会打印的,后面接一myname (); 才会执行函数内部的代码。

总结:
其实很多的方法都是给予闭包像redux 中的store就是用闭包和观察者模式来完成的,闭包应用的地方很多也很广泛,可以和很多的东西搭配,这是小编自己的一点理解,不足之处希望大家可以补充。

发布了11 篇原创文章 · 获赞 1 · 访问量 111

猜你喜欢

转载自blog.csdn.net/zixu666321/article/details/104458905