这两个代码片段之间的语义差异是什么?
示例 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
并有理由的人之一,请分享=)