【问题标题】:(...()) vs. (...)() in javascript closures [duplicate]javascript 闭包中的 (...()) 与 (...)() [重复]
【发布时间】:2012-02-05 03:52:55
【问题描述】:

我知道这很愚蠢,但这之间有什么区别:

(function() {  
    var foo = 'bar';  
})();

还有这个?

(function() {  
    var foo = 'bar';  
}());

JSLint 告诉我们Move the invocation into the parens that contain the function,但我认为没有必要。

编辑:答案太酷了。 ~functionJSHint 替代方案以及 jQuery 对 (/***/)(); 的偏好以及 Crockford 的解释!我以为我会得到“它们是一样的”这样的答案。
你们通过upvotes决定最好的一个,我打勾。

【问题讨论】:

  • 这两个示例几乎相同,但dog balls 版本在第一组括号之外返回结果,而 Crockford 批准的版本在括号内返回结果。这很少是重要的,但它是一个区别。
  • @Okonomiyaki3000 没有区别,除非您显着更改它(即在括号内添加更多内容)。事实上,我假设foo = (/***/)();foo = (/***/()); 可以编译成相同的字节码。考虑(a + b) + (c + d) 将如何编译为与a + (b + c) + d 相同。
  • 是的,foo = (/***/)();foo = (/***/()); 相同,但 (foo = /***/)();(foo = /***/)(); 不同。而且,是的,这是迂腐的。这样做可能永远没有很好的理由。
  • @Okonomiyaki3000 这似乎不够迂腐,因为我正要指出你说的两个不同的例子实际上是相同的。
  • 确实如此。上一篇文章有​​错别字。实际上,两者不同的是:(foo = /***/)();(foo = /***/());

标签: javascript comparison closures anonymous-function jslint


【解决方案1】:

没有区别。两者都是让 JavaScript 解析器将您的函数视为 表达式 而不是 声明 的有效方法。

请注意,+! 也可以使用,并且有时会被缩小器用于保存大小为的字符:

+function() {  
    var foo = 'bar';  
}();

!function() {  
    var foo = 'bar';  
}();

编辑

正如@copy 指出的那样,为了完整起见,~- 也可以使用。

-function() {  
    var foo = 'bar';  
}();

~function() {  
    var foo = 'bar';  
}();

【讨论】:

  • 为了完整起见,~- 也会这样做(所有一元运算符)。 ~ 当然是最酷的方式。
  • 哇,为那种神秘的语法+1!如果他们在生产中看到它,那肯定会让一些毫无戒心的编码人员挠头。那么它可以跨浏览器工作吗?它在规范中吗?我不明白它为什么会起作用。
  • @CamiloMartin - 是的,这只是让解释器不认为它是一个函数 声明 - 就像 `function() foo {}
  • 是的,你忘记了一个一元运算符! :D 但它不会使它更短或更清晰。 jsfiddle.net/minitech/WL8tU/1(也叫@CamiloMartin;你忘记了一个二元运算符。)
  • 哦,还有一个更清楚一点的是void,虽然我讨厌那个关键字。 (只是为了一个完整的列表。)jsfiddle.net/WL8tU/2
【解决方案2】:

存在 JSLint 违规是因为 Douglas Crockford 说括号外的版本看起来像“狗球”。

你可以在this video听到他的讨论:

我认为这看起来很愚蠢,因为我们正在谈论的是整个调用,但我们把这些东西挂在它外面看起来有点像......狗球。

他建议里面的括号帮助读者理解整个语句是一个函数表达式而不是一个声明。

【讨论】:

  • 我想要 JSLint 中的 Ignore Douglas Crockford's preferences 复选框。
  • @Rob - 我知道他抱怨使用++。抱歉,但我永远不会永远同意这一点。
  • @AdamRackis - 我同意。我也不认为我会停止使用它。
  • @Jared - 听起来像是你的缩小器中的错误。你用的是哪一个?
  • @GlennMohammad 哪个页面?结束了吗?
【解决方案3】:

不,我不相信有任何区别。我个人更喜欢前者(而 jQuery 等人似乎也同意),但它们在我测试过的每个引擎中的工作原理都是一样的。

另外,JSLint 有时有点过于严格。 JSHint 在这方面可能会好一点。

【讨论】:

  • 哦,不知道 JSHint。是的,只有在使用 JSLint 测试时编写的代码才能通过它,我似乎永远无法在检查之前避免错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2012-05-06
  • 2017-07-22
相关资源
最近更新 更多