Location of parenthesis for auto-executing anonymous JavaScript functions? (4个答案)
2年前关闭。
这两个代码段之间的语义差异是什么?
例子1
var x = (function () {} ());
例子2
var x = (function () {} )();
编写上的区别在于我们在括号中放置了
()
,它告诉JavaScript解释器立即执行代码块。从技术上讲,没有区别。如果我可以改写我的问题的措词并删除“语义”一词,那么新的问题已经在此处得到回答和阐述:
https://stackoverflow.com/a/6645915/1268003但是,语义部分是我的两难选择,我希望这个线程能给我们带来些启发。由于它是“语义”的,因此不可能有客观的答案,并且根据Stackoverflow的
FAQ,我的问题被认为是无效的。但是,我可以为这个问题的有效性辩护,这可能会在评论中发生。现在,让我们继续前进。
定义问题
那里的所有JavaScripter中绝对绝大多数似乎都使用
example 2
。实际上,我还没有发现该规则的一个例外(或者我最近去哪儿了?)。特别是jQuery插件开发人员,编写如下代码:
示例3(请参见
example of an example)
(function ($) {} )(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
并有理由的人,请分享=)
为什么?可读性
由于“可读性”的口号,许多事情都在代码中完成。这在编写代码时非常宝贵。您的代码应易于被其他开发人员继承。
你忘了一个
或为零。
范例0
var x = function(){ }();
这就是为什么人们不使用它的原因:很难阅读。通常,这些关闭会变得非常大,非常快。不必一定要到闭包的最后来确定它只是一个名为x且没有自执行的变量-例如
var x = function(){};
为此,开发人员使用圆括号将其自执行闭包包装起来:
var selfExecuting = (function(){})();
,甚至是
(function(){})();
,因此从第1行可以明显看出这是自我执行。这也意味着,如果遇到如下函数:
var notExecuting = function(){};
,通常可以在第1行假定它不是自执行的。
编码时,可读性非常重要。这对维护很重要。这对于保持一致性很重要。这对文档很重要。
尽管请记住,开发代码不应是生产代码。