Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是社区';在JavaScript中的匿名函数声明周围加几个括号的意图是什么?_Javascript_Closures_Anonymous Function_Parentheses - Fatal编程技术网

什么是社区';在JavaScript中的匿名函数声明周围加几个括号的意图是什么?

什么是社区';在JavaScript中的匿名函数声明周围加几个括号的意图是什么?,javascript,closures,anonymous-function,parentheses,Javascript,Closures,Anonymous Function,Parentheses,这两段代码之间的语义区别是什么 例1 var x=(函数(){}()) 例2 varx=(函数(){})() 编写的不同之处在于我们将括号对()放在哪里,它告诉JavaScript解释器立即执行代码块。从技术上讲,没有区别。如果我可以重新表述我问题的措辞并删除“语义”一词,那么新问题已经在这里得到了回答和阐述: 但是,语义部分是我的困境,我希望这条线索能有所启发。由于它是“语义的”,因此不可能有客观的答案,根据Stackoverflow的定义,我的问题无疑处于无效的边缘。然而,我可以为这个问

这两段代码之间的语义区别是什么

  • 例1

    var x=(函数(){}())

  • 例2

    varx=(函数(){})()

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

但是,语义部分是我的困境,我希望这条线索能有所启发。由于它是“语义的”,因此不可能有客观的答案,根据Stackoverflow的定义,我的问题无疑处于无效的边缘。然而,我可以为这个问题的有效性辩护,这可能发生在评论中。现在,让我们继续前进

定义问题 绝大多数Java脚本编写者似乎都在使用示例2。事实上,我还没有发现这个规则有一个例外(或者我最近去了哪里?)。特别是jQuery插件开发人员,编写如下代码:

  • 例3(见附件)

    (函数($){})(jQuery)

我的《圣经》一次也没有使用这种做法。作者David Flanagan坚持使用示例1(第249页是作者对这种做法进行评论的地方)

不管是哪种结构,添加的括号都有一个,而且只有一个目的:最大化可读性澄清。那么,我可以问一下,澄清什么

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

  • 例4

    function(){var local=“local variable!”;}

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

  • 例5

    function(){}()

为了在代码中阐明这一点,最佳做法是添加两个括号,在某种程度上这也澄清了闭包:

  • 例6

    (函数(){}())

这是示例1
的精确副本。因此,我的推理给出了
示例1
是我们“应该”编写代码的方式。每当我选择使用
示例2
时,我只澄清闭包的使用,而不是立即执行匿名函数这一事实。但是,只要在整个代码段的外部放置澄清括号,我们就可以同时捕获这两个内容

是的,我可以批评我的推理。在
示例3
中,我认为“嘿,外部引用被复制到内部的别名”很有吸引力。备选方案:

  • 例7

    (函数($){}(jQuery))

…在这一点上没有那么清楚。但是,
示例2
没有使用这种传递值技术。就我个人而言,在我编写闭包的大部分时间里,我不需要传递任何东西。尽管如此,如果我们被允许对此持原教旨主义态度,jQuery插件实践永远不会澄清匿名函数的立即执行

示例1用户
如果我的推理是正确的,那么为什么整个社区都在使用
示例1
?他们的唯一意图是只作出两项澄清中的一项吗?也许只是也许,他们甚至没有目标,但仅仅遵循一个我们无法解释的目标的传统?我还没有编写jQuery插件,也没有使用
example2
,因为我是从阅读圣经开始我的职业生涯的。但是如果你是众多使用例1的人中的一员,并且有理由,请分享=)

为什么?可读性

由于“可读性”的口号,很多事情都是用代码完成的。它在编写代码方面是非常宝贵的。您的代码应该很容易被其他开发人员继承

你忘了一个

或者说是零

  • 示例0

    这就是为什么人们不使用它:它很难阅读。通常这些闭包会变得非常大,非常快。有些人不必在闭包的最后确定它只是一个名为x的变量,没有自执行功能,比如
    var x=function(){}为此,开发人员用括号包装了他们的自执行闭包:
    var selfExecuting=(function(){})()
    ,甚至是简单的
    (function(){})()所以从第1行可以明显看出这是自动执行的。这还意味着,如果您遇到这样的函数:
    var notExecuting=function(){}通常可以在第1行假设它不是自动执行的

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


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

    我喜欢你的答案,特别是示例0=)我认为你为一个重要的细节让路:
    自动执行闭包
    。正是我内心的原教旨主义者想要把括号扩大到包容一切,而不仅仅是闭包。最后,可读性是读者对它的理解。鉴于整个社会的实践,我认为可以肯定地说,哪一种选择
    var x = function(){ }();