我如何解释在包装的 Javascript 闭包的开头和结尾传递的参数的作用,如下所示?
(function($, window) {
return $(function() {
return alert("js!");
});
})($, window);
我如何解释在包装的 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);
init 函数正在传递参数jQuery
,并且window
在定义后立即作为参数提供给 init$
函数win
如果你把它分解成等效的代码,那也可能更容易理解
function init($, win) {
return $(function() {
return alert("js!");
});
}
init(jQuery, window);
通过这种方式,您传递的参数将在未来覆盖范围内是安全的。例如:
var a = 1
(function(a){
setTimeout(function(){
console.log('This variable is still safe', a);
},2000)
})(a)
a = 0
console.log('has changed', a)
因此,在您的示例中,您可以确定 $ 和 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();
当一个函数返回另一个函数时,它可以包含在括号中以立即执行。最后一个括号是传递给它的参数。
你可以做一些测试才明白:
var a (function(){});
typeof a;
a.toSource()
typeof (function(){});
(function(){}).toSource()