未知的JavaScript语法可能与闭包有关

未知的JavaScript语法可能与闭包有关,javascript,Javascript,我发现了一些我不知道的JavaScript语法,我甚至不知道它是如何调用的,或者它是做什么的,所以我找不到任何文档 我在MDC上找到它: 我感兴趣的部分是: var Counter = (function() {})(); 圆括号的作用是什么?如何调用它以及在何处使用它?这是模块模式。它通常用于创建单例。看看这个答案: (function(){})(是一个立即执行的函数 这将在代码块周围创建私有范围。这还可以创建一个闭包,该闭包在函数结束后用于维护状态 由于function(){}()是非法语

我发现了一些我不知道的JavaScript语法,我甚至不知道它是如何调用的,或者它是做什么的,所以我找不到任何文档

我在MDC上找到它:

我感兴趣的部分是:

var Counter = (function() {})();

圆括号的作用是什么?如何调用它以及在何处使用它?

这是模块模式。它通常用于创建单例。看看这个答案:

(function(){})(
是一个立即执行的函数

这将在代码块周围创建私有范围。这还可以创建一个闭包,该闭包在函数结束后用于维护状态

由于
function(){}()
是非法语句(JS解析器失败),因此需要在
function(){}
周围使用


另外,一个习惯是确保将立即执行的函数包装在
()
中,以便代码的读者知道他们应该对函数的返回值而不是函数感兴趣。

当您有一个名为

function a() {
   alert("hi");
}
你这样称呼它:

a();

(function(){})(
中,您只是跳过了前面定义函数的部分。您已经定义了一个未命名的函数并调用了它。

圆括号
的可能重复项通常称为圆括号:D“用于创建单例”它用于创建闭包。将代码块包装到自动执行函数中会创建私有作用域和所述作用域的闭包。@Raynos:该模式可用于创建单例。这是为了解决OP关于该模式(或“语法”)可用于何处的询问。根据我的经验,它通常被用来创建单例。@CDSanchez:他问的是语法,而不是模式。@Tomalak Geret'kal:我理解。但是OP忽略了这样一个事实,即该语法实际上被建立为模块模式。当他一开始甚至不知道这是一种模式时,他不会问这个模式。我是从这个问题最终走向何方的角度来回答这个问题的:也就是说,这个问题叫什么,我如何使用它?它是模块模式,可用于创建单例(以及其他内容)。关于模块模式的内部内容,SO和web上有无数的资源。@CDSanchez:基本函数调用语法与模块模式无关。阅读他说“我感兴趣的部分是……”的地方。这很清楚。
(函数{})(
也是一个非法语句。你的意思可能是
(function(){})(
function(){}()是完全有效的。许多函数在调用之前包装函数定义本身:
(function(){})()
Crockford(以及通过Crockford的JSLint)建议使用前者,但将其全部包装在parens中:
(function(){}())@Tomalak Geret'kal谢谢,修正了@JAAulde
function(){}()不是有效的表达式。它抛出
SyntaxError:Unexpected token(
)。当然,如果您在它前面加上
var foo=…
,它就会工作。是否包装函数或整个调用取决于个人偏好和编码风格。
a();