首先從咱們常見的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