浅谈对JavaScript闭包的理解

首先我们先来看一段代码

从上面的代码可以看出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就是用闭包和观察者模式来完成的,闭包应用的地方很多也很广泛,可以和很多的东西搭配,所以我们的路还有很长,这只是一个开始(未完待续。。。)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值