当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。
在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被回收,否则这个对象一直会保存在内存中。
当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会 “污染” 全局的变量时,就可以用闭包来定义这个模块。
闭包的问题:让变量得不到释放,增加内存使用率,造成内存泄漏;
闭包的使用场景:
-
使用场景一: 给对象设置私有变量并且利用特权方法去访问私有属性
-
使用场景二: 采用函数引用方式的
setTimeout
调用
setTimeout
: 接收两个参数,第一个参数可以是一段js代码,亦可以是一个函数,第二个参数是我们延迟执行第一个参数的时间(实际上不是延迟执行,而是延迟加入执行队列),在此我们要讨论的情况是第一个参数是一个函数的情况,我们传入的参数实际上是函数对象的引用,那这时候就不能向函数传参了,那么闭包就派上用场了 -
使用场景三: 封装相关功能集
一个内联执行的函数表达式返回了内部函数对象的一个引用。并且分配了一个全局变量,让它可以被作为一个全局函数来调用。而缓冲数组作为一个局部变量被定义在外部函数表达式中。它没有被扩展到全局命名空间中,并且无论函数什么时候使用它都不需要被再次创建。
网友评论