前言:
此刻各位老铁们对“如何测试js闭包问题”可能比较重视,小伙伴们都想要知道一些“如何测试js闭包问题”的相关内容。那么小编同时在网络上汇集了一些有关“如何测试js闭包问题””的相关资讯,希望朋友们能喜欢,看官们一起来学习一下吧!首先我们先来看一段代码
从上面的代码可以看出js都有一个特性特性,局部方法可以访问外部父类方法的属性,也就是说,子类或子方法可以访问父类的资源。
我们再来看一段代码
为什么我们打印出来的是undefined?因为子方法的变量作用域仅仅是子方法的范围,外部是无法获取到的。那么js中是如何获取字方法里面的值呢?我们来看下面的代码
在外部无法获取到funOne内部的局部变量,但是funOne内部的局部方法funTwo却可以获取到,因此 返回一个funTwo的引用,这样在外部通过这个funTwo就可以获取到funOne的内部变量。而这个方法内的局部方法funTwo就叫做闭包。简单的总结下有权访问另一个函数作用域内变量的函数都是闭包。
为什么要用闭包
我们知道,js的每个函数都是一个个小黑屋,它可以获取外界信息,但是外界却无法直接看到里面的内容。将变量 myname放进小黑屋里,除了funOne函数之外,没有其他办法能接触到变量myname,而且在函数funOne外定义同名的变量myname 也是互不影响的,这就是所谓的增强“封装性”。
闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面说到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在funOne调用后被自动清除。
为什么会这样呢?原因就在于funOne是funTwo的父函数,而funTwo被赋给了一个全局变量,这导致funTwo始终在内存中,而funTwo的存在依赖于funOne,因此funOne也始终在内存中,不会在调用结束后,被回收。好比一个餐厅,盘子总是有限的,所以服务员会去巡台回收空盘子,但还装着菜的盘子他怎么敢收?
注意!!
(1) 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2) 闭包会在父函数外部,改变父函数内部变量的值。所以,,不要随便改变父函数内部变量的值。
常见缺陷
函数带()才是执行函数单纯的一句 var myname =funOne; 是不会打印的,后面接一myname (); 才会执行函数内部的代码。
总结
其实很多的方法都是给予闭包像redux 中的store就是用闭包和观察者模式来完成的,闭包应用的地方很多也很广泛,可以和很多的东西搭配,所以我们的路还有很长,这只是一个开始
标签: #如何测试js闭包问题