首先从我们常见的javascript函数开始:
function funName(){...};//函数声明,function关键字声明一个函数,再指定funame函数名
function(){...};//匿名函数,声明了函数但没指定函数名。 附给一个变量——函数表达式;附给一个事件——事件处理程序(object.onclick=function(){...};);创建闭包...
var funName=function(){...}; //函数表达式,将匿名函数附给一个变量。
function funName(){alert("hello world");}
funName();
//这样调用函数
function(){alert("hello World");}
(function(){alert("hello World");})();
//这样直接调用,或者(function(){alert("hello World");}());这两个没有区别哦
var fnName=function(){
alert('Hello World');
}();
//函数表达式后加()直接调用
function fnName(){
alert('Hello World');
}();
//报错
如何传参
(function(a){alert(a);})(123);
new function(a){alert(a);}(123);
结论 X()要想通过加括号直接运行,那么X必须是一个函数表达式。问(function(){alert("hello World");})();中外面的括号是一个分组操作符,会让解析器强制将JSON的花括号解析成表达式而不是代码块。
作用
(function(){...})()称为闭包。
匿名函数体内形成一个子作用域,这个子作用域可以调用外部作用域的变量,但外部作用域不可以调用子作用域的变量。这样便不会污染全局变量。
这种方式可以保存闭包外面的变量的状态
举例
function fn() {
for(var i=0 ; i<2; i++) {
var variate= i;
setTimeout(function() {
alert(variate);
}, 2000);
}
}
fn();//1,1
function fn() {
for(var i=0 ; i<2; i++) {
(function(){
var variate= i;
setTimeout(function() {
alert(variate);
}, 2000);
})();
}
}
fn();//0,1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。