闭包(closure)指有权访问另一个函数作用域中变量的函数
— Javacript高级程序设计 p309
简单理解,一个作用域可以访问另一个函数内部的私有变量
// 其中 test就是一个闭包
function fn(){var num = 10function test () { console.log(num) }
}
在上下文中会有一些私有的变量AO(XXX),这些私有变量和外界的变量不会冲突
(互不影响)
团队协作开发
中,为防止全局变量的冲突污染,建议每个开发者,把自己的代码放到一个闭包中(立即执行函数即可)保护起来封装一个插件或类库
等,防止自己定义的变量和方法与用户定义的冲突,需要把所写的代码放到一个闭包中,例如 Jquery
某些情况下,上下文中的某些内容被为外界占用
后,当前上下文并不会出栈销毁
,这样开一把上下文中的一些信息存储起来
1.在某些需求下,经常需要形成一个闭包,存储一些值(且不能销毁),供后面的程序运行使用,例如 惰性函数
,柯里化函数(bind)
,compose
函数等
优点:保护和保存代码不受污染
缺点:会产生不销毁的上下文,导致栈/堆内存消耗过大
,也会导致内存泄露
(该内存空间使用完毕之后未回收),影响页面的运行性能
给每个对象的堆内存
起一个变量名,这个变量就是’命名空间’
var a = 1
var utils = { 方法... }
闭包
)闭包之间的方法公用性
var utils = (function(){var num = 10function test(){console.log(num)}//函数...return {test // 相当于 test:test// 方法...}
}())
utils.test() // 直接用命名空间 utils 调用其中方法