一.匿名函数的语法
(function(){
//这里是块级作用域
})()
匿名函数的表达式相当于定义一个函数然后调用它,如:
var someFunction=function(){
//这里是块级作用域
} ;
someFunction(); //调用someFunction()
将调用时是someFunction替换一下就变成了下面的样子
function(){
//这里是块级作用域
}()
但是为什么不能直接写成function(){ }()呢?
因为JavaScript将function关键字当做一个函数申明的开始,而函数申明后面不能跟圆括号。但是函数表达式后面却可以跟圆括号。要将函数申明转换为函数表达式,只要给他加上一对圆括号即可,即:( function(){} )()
二.为什么要用匿名函数
先来看看模块化时期前(代码简单的堆在一起,只要能从上往下依次执行就可以了)出现的问题:
- 1.全局变量灾难
- 2.函数命名冲突
- 3.依赖关系不好管理
b.js依赖a.js,标签的书写顺序必须是
<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>
所以在模块化的萌芽阶段会用自执行函数来模仿块级作用域解决这些问题。
例如: 用自执行函数来包装代码
modA = function(){
var a,b; //变量a、b外部不可见
return {
add : function(c){
a + b + c;
},
format: function(){
//......
}
}
}()
这样function内部的变量就对全局隐藏了,达到是封装的目的。但是这样还是有缺陷的,modA这个变量还是暴漏到全局了,随着模块的增多,全局变量还是会越来越多。
无论在什么地方,只要临时需要一些变量,就可以使用私有作用域
function getNumbers(){
(function(){
var i=1;
})();
alert(i); //会导致一个错误
}
三.匿名函数在哪里用
匿名函数经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。在一个由很多人开发的大型应用中,过多的全局变量和函数很容易导致命名冲突。而通过创建私有作用域,每个开发人员既可以使用自己的变量,又不必担心搞乱全局作用域。例如:
(function(){
var now=new Date();
if(now.getMonth()==0&&now.getDate()==1){
alert("Happy new year!");
}
})()