可能重复:
What do parentheses surrounding a JavaScript object/function/class declaration mean?
我在jQuery插件等中看到括号内的函数。
例如,
(function(args) {
// ...
})(localVariable);
这究竟是做什么的?
答案 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对象上挂起。
希望这有帮助!