2

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

  • 示例 1

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

  • 示例 2

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

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

但是,语义部分是我的困境,我希望这个线程能有所启发。由于它是“语义的”,因此没有客观的答案,根据Stackoverflow的常见问题解答,我的问题无疑处于无效的边缘。但是,我可以争论这个问题的有效性,这可能会在评论中发生。现在,让我们继续。

定义问题

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

  • 示例 3(参见示例示例

    (function ($) {} )(jQuery);

我的圣经JavaScript: The Definitive Guide根本没有使用这种做法——一次也没有。作者大卫弗拉纳根坚持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并有理由的人之一,请分享=)

4

1 回答 1

1

为什么?可读性

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

你忘了一个

或者说是零。

  • 示例 0

    var x = function(){ }();
    

    这就是人们不使用它的原因:它很难阅读。通常这些闭包会变得非常大,非常快。有人不应该走到闭包的最后来确定它只是一个名为 x 的变量,没有自执行 - 例如var x = function(){};为此,开发人员用括号包装他们的自执行闭包: var selfExecuting = (function(){})();,甚至简单地(function(){})();说从第 1 行可以明显看出这是自动执行的。这也意味着如果你遇到这样的函数:var notExecuting = function(){};你通常可以在第 1 行假设它不是自执行的。

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

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

  • 于 2012-10-05T04:26:40.197 回答