2

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

(function($, window) {
  return $(function() {
    return alert("js!");
  });
})($, window);
4

5 回答 5

5

第一次出现是函数参数,第二次是在执行函数时为这些参数传递值。

请记住,函数的参数不需要与传递的名称匹配(事实上,这可能会在以后引起混淆):

(function(jQuery, w) {
    return jQuery(function(){
        return alert("js!");
    });
})($, window);

会以同样的方式工作。

于 2012-11-14T19:51:14.980 回答
1

如果您更改参数名称并命名函数,可能会更容易解释

(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);
于 2012-11-14T19:54:11.783 回答
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)

因此,在您的示例中,您可以确定 $ 和 window 将是您所期望的。

于 2012-11-14T19:58:10.967 回答
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();

http://jsfiddle.net/xfTcq/

于 2012-11-14T19:57:22.673 回答
0

当一个函数返回另一个函数时,它可以包含在括号中以立即执行。最后一个括号是传递给它的参数。

你可以做一些测试才明白:

var a (function(){});
typeof a;
a.toSource()

typeof (function(){});
(function(){}).toSource()
于 2012-11-14T19:58:01.103 回答