首先从咱们常见的javascript函数开始: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'); }(); //报错
如何传参html
(function(a){alert(a);})(123); new function(a){alert(a);}(123);
结论 X()要想经过加括号直接运行,那么X必须是一个函数表达式。问(function(){alert("hello World");})();中外面的括号是一个分组操做符,会让解析器强制将JSON的花括号解析成表达式而不是代码块。java
做用
(function(){...})()称为闭包。闭包
匿名函数体内造成一个子做用域,这个子做用域能够调用外部做用域的变量,但外部做用域不能够调用子做用域的变量。这样便不会污染全局变量。函数
这种方式能够保存闭包外面的变量的状态
举例.net
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