社区的意图是在JavaScript中使用匿名函数声明放置几个括号?

时间:2012-10-05 04:05:29

标签: javascript closures anonymous-function parentheses

这两段代码之间的语义差异是什么?

  • 示例1

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

  • 示例2

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

写作的不同之处在于我们将括号对()放在一起,它告诉JavaScript解释器立即执行代码块。从技术上讲,没有区别。如果我可以改写我的问题的措辞并删除“语义”这个词,那么新的问题已经在这里得到了回答和阐述:https://stackoverflow.com/a/6645915/1268003

但是,语义部分是我的困境,我希望这个主题可以发挥一些作用。由于它是“语义”的,所以没有客观的答案,我的问题无疑是根据Stackoverflow的FAQ无效的边界。但是,我可以争论这个问题的有效性,这个问题可能会在评论中发生。现在,让我们继续前进。

定义问题

所有JavaScripters的绝对广泛多数似乎使用example 2。实际上,我还没有发现该规则的一个例外(或者我最近在哪里?)。特别是jQuery插件开发人员,编写如下代码:

我的圣经JavaScript: The Definitive Guide根本不使用这种做法 - 不是一次。作者David Flanagan坚持example 1(第249页是作者评论这种做法的地方)。

不要介意哪个构造,添加的括号都有一个且只有一个意图:为了最大限度地提高可读性。 澄清。那么,请问,澄清什么?

我的理由

在JavaScript中编写闭包时,我们在函数中定义一个局部变量,该变量不应该从外部代码访问。在大多数情况下并且由于上下文,我们的函数是一个未绑定到标识符的匿名函数。像这样:

  • 示例4

    function () { var local = "Local variable!"; }

再次由于上下文和通常的做法,我们希望立即执行该代码片段。所以我们抛出几个括号。这将告诉JavaScript解释器运行该函数:

  • 示例5

    function () {} ()

为了在代码中澄清这一点,最佳做法是添加几个括号,这也澄清了闭包:

  • 示例6

    (function () {} ())

这是example 1的精确复制品。因此,我的推理是example 1是我们“应该”编写代码的方式。每当我选择使用example 2时,我只阐明闭包的使用,而不是我们的匿名函数立即执行的事实。但是,通过最小的努力将我们的澄清括号放在整个代码片段的外部,我们可以捕获它们。

是的,我可以批评我的推理。在example 3中,我觉得很有吸引力的想法“嘿,外部引用被复制到内部的别名”。替代方案:

  • 示例7

    (function ($) {} (jQuery))

..在这方面并不那么清楚。但是,example 2不使用此按值传递技术。就个人而言,在大多数情况下,当我编写闭包时,我不必传递任何东西。但是,如果我们被允许成为原教旨主义者,jQuery插件实践永远不会澄清我们的匿名函数的立即执行。

示例1用户

如果我的推理成立,为什么整个社区都使用example 1?他们唯一的意图是只进行两次澄清吗?也许只是也许,他们甚至没有目的,但是只是传统的导致我们可能无法解释的目的?我还没有编写jQuery插件,或者使用example 2因为我开始阅读圣经的职业生涯。但是,如果您是使用example 1且有理由的众多人之一,请分享=)

1 个答案:

答案 0 :(得分:1)

<强>为什么呢?可读性

由于“可读性”的口头禅,许多事情都在代码中完成。它在编写代码时非常有用。您的代码应该很容易被其他开发人员继承。

你忘了一个

或者为零。

  • 示例0

    var x = function(){ }();
    

    这就是为什么人们不使用它:它很难阅读。通常这些闭合变得非常大,非常快。有人不应该到闭包的 very end 来确定它只是一个名为x而没有自行执行的变量 - 例如var x = function(){};为此,开发人员包装了他们的使用括号自我执行闭包:var selfExecuting = (function(){})();,或者甚至是(function(){})();,以便从第1行显然这是自动执行的。这也意味着如果你遇到这样的函数:var notExecuting = function(){};你通常可以在第1行假设它不是自动执行的。

    编码时可读性非常重要。这对维护很重要。一致性很重要。这对文档很重要。

    尽管如此,请记住,开发代码不应该是生产代码。