如何解釋在封裝的Javascript封閉的開始與結束時傳遞的參數角色,如下所示?傳遞給javascript閉包的參數是做什麼的?
(function($, window) {
return $(function() {
return alert("js!");
});
})($, window);
如何解釋在封裝的Javascript封閉的開始與結束時傳遞的參數角色,如下所示?傳遞給javascript閉包的參數是做什麼的?
(function($, window) {
return $(function() {
return alert("js!");
});
})($, window);
第一外觀是函數的參數,執行所述功能時的第二被傳遞值的那些參數。
請記住,參數的功能並不需要匹配傳遞的名稱(這可能,事實上,導致後來的混亂):
(function(jQuery, w) {
return jQuery(function(){
return alert("js!");
});
})($, window);
會的工作方式相同。
這可能是更容易解釋,如果你更改參數名稱和命名功能
(function init($, win) {
return $(function() {
return alert("js!");
});
})(jQuery, window);
初始化函數被傳遞的參數jQuery
和window
立即,因爲它的定義,它們都可以作爲參數傳遞給初始化函數作爲$
和win
如果你打破它成等價的代碼,這也可能是更容易理解
function init($, win) {
return $(function() {
return alert("js!");
});
}
init(jQuery, window);
上面的參數集是參數被接收到的地方,底部的一組參數是它們通過的地方。
他們確保它們的全局變量的封閉副本不會在閉包之外重新分配。這是一種保護您的代碼免受其他(可能寫得很差)代碼的方式。考慮下面這個例子:
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();
當函數返回另一個函數可以在parentesis被封閉爲立即執行。 最後一個括號是傳遞給它的參數。
你可以做一些測試就明白了:
var a (function(){});
typeof a;
a.toSource()
typeof (function(){});
(function(){}).toSource()
在您傳遞參數,將在安全的範圍從對未來的覆蓋的方式。例如:
var a = 1
(function(a){
setTimeout(function(){
console.log('This variable is still safe', a);
},2000)
})(a)
a = 0
console.log('has changed', a)
所以在你的例子中,你可以肯定$和窗口就是你所期待的。
開始是參數*被接收*的地方。最後是他們通過*的地方。 – bfavaretto