将函数放在括号中会发生什么?

时间:2011-07-06 03:08:05

标签: javascript jquery

  

可能重复:
  What do parentheses surrounding a JavaScript object/function/class declaration mean?

我在jQuery插件等中看到括号内的函数。

例如,

(function(args) {
   // ...
})(localVariable);

这究竟是做什么的?

2 个答案:

答案 0 :(得分:1)

您的意思是以下内容?:

(function() {
   // ...
})();

这基本上确保任何“var”声明都保持私有(它们的作用域是放置它们的匿名函数)而不是全局声明。例如,考虑:

 var counter = 0;
 window['inc'] = function() {
    return counter++;
 };

VS

 (function() {
    var counter = 0;
    window['inc'] = function() {
       return counter++;
    };
 })();

这两个都具有定义函数window.inc的效果,该函数返回递增的计数器;但是,在第一个版本中,counter实际上对所有其他模块都可见,因为它在全局范围内,而后者确保只有window.inc可以访问counter

请注意,代码会创建一个函数并立即调用它(这就是最后一个parens的用途)。

答案 1 :(得分:1)

非官方名称是“立即函数” - 基本思想是函数是动态定义和调用的。

这是一个简单的例子:

http://javascriptmountain.com/2011/06/functions/immediate-functions-in-javascript-the-basics/

除非将函数的返回值赋给变量,否则实际上不需要括号,但它们通常用于可读性。

在jquery插件之类的情况下完成它的原因是它提供了一种用于执行代码的“沙盒”。假设我们做了以下事情:

(function($) {
   // augment $ with methods
}(jQuery));

这定义了一个接受一个参数的函数,然后IMMEDIATELY调用该函数,传入全局jquery对象。在立即函数内声明和使用的任何变量都将本地作用于函数,并且不会干扰全局范围或破坏可能已在其他javascript代码片段中声明的任何全局变量(对于要用于的库而言非常重要)与大量其他代码一起使用)。

但是,由于我们在调用函数时传入全局jquery对象,我们仍然可以在函数内部的'$'参数中添加方法和属性,该函数将在函数完成后在jquery对象上挂起。

希望这有帮助!