JQuery是一个很明显的自执行闭包的例子
如: //无参数的
(function(){
alert('hello');
})();
//有参数的
(function(name){
alert('Hello ' + name);
})('world');
这个闭包有什么用呢?一眼望去就是括号围着,局部变量想跑也不出来到处捣乱,这是其中一个主要用途,当然了,封装一些javascript库也离不开它。
------------------------------------------------------
1.//将自身传进方法,然后实现了方法的扩展,有点象零件组装啊
var blogModule = (function (my) {
my.AddPhoto = function () {
//添加内部代码
};
return my;
}(blogModule));
--------------------------------------
2//好处就是可以调用以前的方法。
var blogModule = (function (my) {var oldAddPhotoMethod = my.AddPhoto;
my.AddPhoto = function () { // 重载方法,依然可通过oldAddPhotoMethod调用旧的方 }; return my;}(blogModule));
----------------------------------------------
3//克隆与继承
var blogModule = (function (old) { var my = {}, key; for (key in old) { if (old.hasOwnProperty(key)) { my[key] = old[key]; } } var oldAddPhotoMethod = old.AddPhoto; my.AddPhoto = function () { // 克隆以后,进行了重写,当然也可以继续调用oldAddPhotoMethod }; return my; } (blogModule));
------------------------------------------
4.//跨文件共享私有对象
blogModule._seal()上锁,_unseal() 开锁,实现内部变量的私有化。我认为这样实现并不是最好的,但是我们可以学习下这个开锁闭锁的功能。
var blogModule = (function (my) { var _private = my._private = my._private || {}, _seal = my._seal = my._seal || function () { delete my._private; delete my._seal; delete my._unseal; }, _unseal = my._unseal = my._unseal || function () { my._private = _private; my._seal = _seal; my._unseal = _unseal; }; return my; } (blogModule || {}));
二。
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解 (http://www.jb51.net/article/36600.htm)
函数表达式
1、JavaScript中定义函数有2钟方法:
1-1.函数声明:
function funcName(arg1,arg2,arg3){
//函数体
}
①name属性:可读取函数名。非标准,浏览器支持:FF、Chrome、safari、Opera。
②函数声明提升:指执行代码之前会先读取函数声明。即函数调用可置于函数声明之前。
1-2.函数表达式:
var funcName = function(arg1,arg2,arg3){
//函数体
};
①匿名函数(anonymous function,或拉姆达函数):function关键字后无标识符,name属性值为空字符串。在把函数当成值使用时,都可用匿名函数。
②类似其他表达式,函数表达式使用前需先赋值,故不存在"函数声明提升"那样的作用。
③ECMAScript中的无效函数语法:
if判断中的重复函数声明
if(condition){
function sayHi(){
alert("Hi!");
}
} else {
function sayHi(){
alert("Yo!");
}
}
浏览器JavaScript引擎修正错误差异:大多浏览器会返回第二个声明,忽略condition;FF则会在condition为true时返回第一个声明。
使用函数表达式可解决并实现:
if判断 函数表达式
var sayHi;
if(condition){
sayHi = function(){
alert("Hi!");
}
} else {
sayHi = function(){
alert("Yo!");
}
}