2012-06-18 139 views
9

可能重复:
Difference between (function(){})(); and function(){}();自执行功能

我想了解一些的的JavaScript功能好一点。在The Definitive JavaScript它说,自执行的功能应该有括号一轮他们像这样:

var obj = (function() { 
    var value = 0; 

    return { 
     increment: function(inc) { 
      value += typeof inc === "number" ? inc : 1; 
     }, 
     getValue: function() { 
      return value; 
     } 
    } 
})(); 

但在JavaScript - The Good Parts哪里这个例子摘自,它有没有以上括号中自动执行功能全面,就像这样:

var obj = function() { 
    var value = 0; 

    return { 
     increment: function(inc) { 
      value += typeof inc === "number" ? inc : 1; 
     }, 
     getValue: function() { 
      return value; 
     } 
    } 
}(); 

这两个例子都适用于我,但我想问一下我是否应该知道的功能有任何区别。我希望这不是微不足道的。我只是想确定。

非常感谢。

编辑:

正如罗布W公司已经指出的那样,关于这个问题的另一个线程。从其他帖子链接到的This is an excellent blog regarding this issue

+4

在这种情况下,两者都是等价的。当你省略'var obj ='时,后者会抛出一个错误。所以,坚持#1,除非字节变得昂贵。 –

+0

非常感谢罗布。只是有兴趣知道:在什么情况下我会省略'var obj ='?这会将对象返回到顶层对象不是吗?干杯。 – Joe

+1

@Joe如果你想让函数运行(即你想要它的副作用),但是它没有返回任何值,或者你不关心它的返回值是什么,你会省略'var obj'。 – Alnitak

回答

13

有在这种情况下,任何差别不大,但只因为它的前缀为:

var obj = ... 

没有这个,只有第一个版本是正确的,因为你需要额外的括号,让译员以正确解析function作为函数表达式而不是作为函数声明

如果你只想让函数运行(即你想要它的副作用),但是它不是返回任何值,或者你不关心它的返回值是什么,那么你当然只会省略var obj

1

在本例中没有任何功能上的差异,但我确实认为括号使其更具可读性。你怎么知道它是如何没有parens的范围?它被吊起来了吗? This is a brilliant thread关于这个问题。

旁白:

的JSLint会抱怨。“函数声明并非可调用裹在括号整个函数调用”我认为大多数浏览器解析器没有在严格模式下运行通常会让它通过,但最好不要依赖它。

3

的JavaScript:好的部分被写了道格·克罗克福德,谁更新了他的例子是这样的:

var obj = (function() { 
    var value = 0; 

    return { 
     increment: function(inc) { 
      value += typeof inc === "number" ? inc : 1; 
     }, 
     getValue: function() { 
      return value; 
     } 
    }; 
}()); 

所以整个表达式的括号内。

不需要外部括号的想法是,它使开发人员清楚这是一个有意识的自我执行功能。所以这个值是可读性。