如何解释在封装的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