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

时间:2012-11-14 19:49:55

标签: javascript

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

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

5 个答案:

答案 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函数在定义时立即传递参数jQuerywindow,它们作为$win

如果您将其分解为等效代码,那么也可能更容易理解

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();

http://jsfiddle.net/xfTcq/

答案 4 :(得分:0)

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

你可以做一些测试了解:

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

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