单例为一种设计模式,指只能实例化一次的对象,单例的好处
- 避免暴露太多变量到全局变量window中,可以用来做命名空间,避免命名冲突,可以用来写类库等,jquery就是一个大大的命名空间 jQuery.fn = jQuery.prototype = {..}
var ValidateUtil = {
checkEmail : function(){};
checkPassword : function(){};
};
该单例对window只暴露一个ValidateUtil 的命名空间
- 执行匿名函数,闭包的特性
var initLayout = (function(){
var layoutBox = document.getElementById("layoutId");
layoutBox.style.width = window.document.clientWidth;
layoutBox.style.height = window.document.clientHeight;
})();
通过该函数,我们设置了布局的宽度和高度,由于外部不能引用内部变量,执行函数之后,变量马上释放,节省内存。
- 缓存变量,让变量始终保存在内存中
var f1 = (function(){
var i = 0;
var out = function(){
console.log(i);
};
add = function(){//没有添加var为全局变量
i++;
}
return out ;
}());
var out = f1; //out暴露在window中,被全局变量引用,而out又依赖i,所以i变量缓存在变量中
add();
out(); //输入i为1说明i长住在内存中
闭包是单例的一种实现方式,创建一个匿名函数,然后立即运行它,所有变量和函数都在一个“闭包”中
(function(){
var name = "liuxg";
var i = 0
var f = function(){ //内部访问外部函数的变量
console.log("name="+name + " age=" + age );
}
})();
先用括号把函数定义括起来,从而得到该函数对象,然后后面的括号是立即运行它。jQuery就是这样子实现:
(function( window, undefined ) {
......
window.jQuery = window.$ = jQuery; //最后一行
})(window);
注:大量滥用闭包会导致内存保存暴涨,在IE浏览器中还可能会出现内存泄漏,应该慎用闭包