如何解释在包装的Javascript闭包的开头到结尾传递的参数的作用如下所示?
(function($, window) {
return $(function() {
return alert("js!");
});
})($, window);
答案 0 :(得分:5)
第一个外观是函数参数,第二个是在执行函数时传递这些参数的值。
请记住,函数的参数不需要与传递的名称相匹配(事实上,这可能会在以后造成混淆):
(function(jQuery, w) {
return jQuery(function(){
return alert("js!");
});
})($, window);
会以同样的方式工作。
答案 1 :(得分:1)
如果更改参数名称并命名函数
,可能更容易解释(function init($, win) {
return $(function() {
return alert("js!");
});
})(jQuery, window);
init函数在定义时立即传递参数jQuery
和window
,它们作为$
和win
}的初始函数的参数可用p>
如果您将其分解为等效代码,那么也可能更容易理解
function init($, win) {
return $(function() {
return alert("js!");
});
}
init(jQuery, window);
答案 2 :(得分: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)
因此,在您的示例中,您可以确定$和窗口将是您所期望的。
答案 3 :(得分: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();
答案 4 :(得分:0)
当一个函数返回另一个函数时,它可以包含在parentesis中以立即执行。 最后一个括号是传递给它的参数。
你可以做一些测试了解:
var a (function(){});
typeof a;
a.toSource()
typeof (function(){});
(function(){}).toSource()