Appearance
闭包作用域(scope)
- 函数执形成一个私有的作用域,保护里面的私有变量不受外界的干扰,这种保护机制称之为“闭包”
- 市面上的开发者认为的闭包是:形成一个不销毁的私有作用域(私有栈内存)才是闭包
柯理化函数
javascript
function fn() {
return function () {};
}
var f = fn();
1
2
3
4
2
3
4
惰性函数
javascript
var utils = (function () {
return {};
})();
1
2
3
2
3
闭包项目实战应用
真实项目中为了保证 JS 的性能(堆栈内存的性能优化),应该尽可能的减少闭包的使用(不销毁的堆栈内存是耗性能的)
闭包具有“保护”作用:保护私有变量不受外界的干扰
在真实项目中,尤其是团队协作开发的时候,应当尽可能的减少全局变量的使用,以防止相互之前的冲突(“全局变量污染”),那么此时我们完全可以把自己这一部分内容封装到一个闭包中,让全局变量转换为私有变量
javascript
(function () {
var n = 12;
function fn() {}
//...
})();
1
2
3
4
5
2
3
4
5
不仅如此,我们封装类库插件的时候,也会把自己的程序都存放到闭包中保护起来,防止和用户的程序冲突,但是我们又需要暴露一些方法给客户使用,这样我们如何处理呢?
JQ 这种方式
把需要暴露的方法抛到全局
javascript
(function () {
function jQuery() {
//...
}
//...
window.jQuery = window.$ = jQuery; //=>把需要供外面使用的方法,通过给WIN设置属性的方式暴露出去
})();
// jQuery();
// $();
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Zepto 这种方式
基于 RETURN 把需要共外面使用的方法暴露出去
javascript
var Zepto = (function () {
//...
return {
xxx: function () {},
};
})();
Zepto.xxx();
1
2
3
4
5
6
7
2
3
4
5
6
7
闭包具有“保存”作用
形成不销毁的栈内存,把一些值保存下来,方便后面的调取使用