2012-11-14 87 views

回答

5

第一外觀是函數的參數,執行所述功能時的第二被傳遞值的那些參數。

請記住,參數的功能並不需要匹配傳遞的名稱(這可能,事實上,導致後來的混亂):

(function(jQuery, w) { 
    return jQuery(function(){ 
     return alert("js!"); 
    }); 
})($, window); 

會的工作方式相同。

1

這可能是更容易解釋,如果你更改參數名稱和命名功能

(function init($, win) { 
    return $(function() { 
    return alert("js!"); 
    }); 
})(jQuery, window); 

初始化函數被傳遞的參數jQuerywindow立即,因爲它的定義,它們都可以作爲參數傳遞給初始化函數作爲$win

如果你打破它成等價的代碼,這也可能是更容易理解

function init($, win) { 
    return $(function() { 
    return alert("js!"); 
    }); 
} 
init(jQuery, window); 
0

上面的參數集是參數被接收到的地方,底部的一組參數是它們通過的地方。

他們確保它們的全局變量的封閉副本不會在閉包之外重新分配。這是一種保護您的代碼免受其他(可能寫得很差)代碼的方式。考慮下面這個例子:

var $ = 'foo'; 

var blah = (function($) { 
    return function() { 
     alert($); 
    }; 
})($); 

var shizzam = (function() { 
    return function() { 
     alert($); 
    }; 
})(); 

// someone evil overwrites my $ var 
$ = 'bar'; 

// blah still works 
blah(); 
// but shizzam is now borked 
shizzam(); 

http://jsfiddle.net/xfTcq/

0

當函數返回另一個函數可以在parentesis被封閉爲立即執行。 最後一個括號是傳遞給它的參數。

你可以做一些測試就明白了:

var a (function(){}); 
typeof a; 
a.toSource() 

typeof (function(){}); 
(function(){}).toSource() 
1

在您傳遞參數,將在安全的範圍從對未來的覆蓋的方式。例如:

var a = 1 
(function(a){ 
    setTimeout(function(){ 
     console.log('This variable is still safe', a); 
    },2000) 
})(a) 
a = 0 
console.log('has changed', a) 

所以在你的例子中,你可以肯定$和窗口就是你所期待的。

相關問題