【问题标题】:Difference between (function(){})(); and function(){}(); [duplicate](function(){})(); 之间的区别和函数(){}(); [复制]
【发布时间】:2010-09-30 05:01:11
【问题描述】:

可能重复:
Are “(function ( ) { } ) ( )” and “(function ( ) { } ( ) )” functionally equal in JavaScript?

这是我还没有完全弄清楚的事情,但我一直在使用 function(){}() 只是因为如果我添加括号,我的 VIM 语法高亮就会搞砸,尽管我已经看到 (function() {})() 很多次,可能是 IE 的问题?

编辑:

var singleton = function() {
    // code
}();

var singleton = (function() {
    // code
})();

【问题讨论】:

  • 你能提供更多的上下文吗?
  • 为什么 VIM 不能处理括号?如果它无法处理这种情况,我很惊讶有这么多人使用它。
  • 是的,括号之间的整个代码块都禁用了 Javascript 语法高亮显示。
  • 在上面显示的示例中,没有区别,因为解析器期待 = 之后的表达式。当您不分配输出时,您需要使用括号来消除函数语句与函数表达式的歧义。括号将解析器放入表达式上下文中。

标签: javascript syntax


【解决方案1】:

Peter Michaux 讨论了An Important Pair of Parens 中的区别。

基本上,括号是一种约定,表示紧随其后的是立即调用的函数表达式,而不是普通函数。特别是如果函数体很长,这会减少意外,

【讨论】:

    【解决方案2】:
    function(){}();
    

    在大多数浏览器中不起作用。您应该在函数周围使用括号才能执行它

    (function(){})();
    

    那么浏览器就会知道最后一个括号应该应用于所有表达式

    function(){}
    

    UPD:如果你不使用括号,浏览器可能会误解你。如果你只是调用函数并关闭结果

    function() {
        alert(1);
    }();
    

    那么ff和ie会报错

    【讨论】:

    【解决方案3】:

    额外的括号让你更清楚地知道你是在构造一个函数然后调用它。这是编码风格的事情,而不是功能性的事情。

    【讨论】:

    • 没有。如果没有括号,包含函数表达式的单个语句将给出语法错误。
    • OP提供的2个例子都是函数表达式,去掉括号也不会有语法错误。只有函数声明会。
    • @bryantsai:你有一点,因为 OP 的示例(稍后添加)使用函数表达式作为赋值的一部分,因此不需要括号,但问题更笼统,而且这个答案具有误导性。另外,我对您在引用函数声明时的建议感到困惑。
    • 我猜标题有点不一致,关于 OP 的 2 个例子。但是,查看问题内容以及前 2 个答案,我觉得它们是正确的。另外,我提到函数声明的意思是括号仅在用于函数声明时才重要。不能立即调用函数声明。但是如果在括号内“分组”,函数声明就变成了函数表达式,因此可以立即调用。我的意思是 OP 的两个示例都是函数表达式,因此有或没有括号都没有区别。
    • 好的,我明白了。我的观点仍然存在:仅由函数表达式(例如 function() { alert("1"); })组成的语句是语法错误。
    猜你喜欢
    • 2011-08-31
    • 2011-04-16
    • 2018-03-15
    • 2012-02-13
    • 1970-01-01
    • 2012-03-12
    • 2018-06-20
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多