javascript-- (function(){...})() 閉包

首先從咱們常見的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(){...})()稱爲閉包。閉包

  1. 匿名函數體內造成一個子做用域,這個子做用域能夠調用外部做用域的變量,但外部做用域不能夠調用子做用域的變量。這樣便不會污染全局變量。函數

  2. 這種方式能夠保存閉包外面的變量的狀態
    舉例.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

若有不對,還請指正。本文參考以下二位做者,感謝
連接描述
連接描述code

相關文章
相關標籤/搜索