传递给javascript闭包的参数做什么?

传递给javascript闭包的参数做什么?,javascript,Javascript,我如何解释在包装好的Javascript闭包的开头和结尾传递的参数的作用,如下所示 (function($, window) { return $(function() { return alert("js!"); }); })($, window); 第一个外观是函数参数,第二个外观是在执行函数时传递这些参数的值 请记住,函数的参数不需要与传递的名称匹配(事实上,这可能会在以后引起混淆): 将以同样的方式工作。如果更改参数名称并命名函数,可能更容易解释 (function i

我如何解释在包装好的Javascript闭包的开头和结尾传递的参数的作用,如下所示

(function($, window) {
  return $(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 $ = '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)

因此,在您的示例中,您可以确保$and 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)