为啥我应该在javascript中的每个函数后使用分号?

Posted

技术标签:

【中文标题】为啥我应该在javascript中的每个函数后使用分号?【英文标题】:Why should I use a semicolon after every function in javascript?为什么我应该在javascript中的每个函数后使用分号? 【发布时间】:2010-12-22 12:31:22 【问题描述】:

我见过不同的开发人员在 javascript 中的函数后包含分号,有些则没有。哪个是最佳做法?

function weLikeSemiColons(arg) 
   // bunch of code
;

function unnecessary(arg) 
  // bunch of code

【问题讨论】:

【参考方案1】:

函数声明后的分号没有必要

FunctionDeclaration 的语法在the specification 中描述如下:

function Identifier ( FormalParameterListopt )  FunctionBody 

语法上不需要分号,但可能想知道为什么?

分号用于分隔语句FunctionDeclaration 不是语句

FunctionDeclarations 在代码进入执行之前被评估,hoisting 是一个常用词,用于解释这种行为。

术语“函数声明”和“函数语句”经常被错误地互换使用,因为 ECMAScript 规范中没有描述函数语句,但是有一些实现在其语法中包含函数语句,特别是 Mozilla-但这又是非标准的。

但是,在您使用FunctionExpressions 时,始终建议使用分号,例如:

var myFn = function () 
  //...
;

(function () 
  //...
)();

如果你在上面的例子中省略了第一个函数后面的分号,你会得到完全不想要的结果:

var myFn = function () 
  alert("Surprise!");
 // <-- No semicolon!

(function () 
  //...
)();

第一个函数将立即执行,因为第二个函数的括号将被解释为函数调用的Arguments

推荐讲座:

Named function expressions demystified(好文章) Explain JavaScript’s encapsulated anonymous function syntax(更多关于 FunctionDeclarationFunctionExpression

【讨论】:

经过编辑澄清,该文章谈到了函数表达式 并不完全熟悉 ECMA,但这也是我使用的标准。好帖子。我在网上看到的大多数 tuts 和我 DL 的代码示例都使用该标准,所以我刚刚适应了它。 这里的一些混淆可能是由于缺少一个好的英文单词“允许,因为它会被忽略”。我们回过头来说“可选”,但这是一种误导,因为它表明在声明后不包括分号与在声明后不包括分号属于同一类别。后者在完全不同的意义上是可选的:这是因为解析器将添加您省略的缺少的分号,而在这种情况下,这是因为解析器将忽略您包含的分号。换句话说:如果一个是可选的,那么 eight. “命名函数表达式解密”链接现在链接到一个死 url,网络存档在这里有一个副本:web.archive.org/web/20100426173335/http://yura.thinkweb2.com/… 最后一个例子很好。在这种情况下省略分号会导致极其奇怪且难以调试的错误。全心全意投票。【参考方案2】:

函数后面的分号不是必须的 使用与否,不会导致程序出错。 但是,如果您打算缩小代码,那么在函数后使用分号是个好主意。 比如说你有像下面这样的代码

//file one
var one=1;
var two=2;
function tryOne()
function trytwo()

//file two
var one=1;
var two=2;
function tryOne();
function trytwo();

当你缩小两者时,你会得到以下输出

请注意,cmets 仅用于说明

//file one
var one=1;var two=2;function tryOne()
function trytwo()

//file two
var one=1;var two=2;function tryOne();function trytwo();

【讨论】:

【参考方案3】:

简单:

在函数大括号结束后保留​​分号; 是一种很好的做法。多年来,它们一直被认为是最佳实践。

始终使用它们的一个好处是,如果您想缩小 JavaScript。

由于缩小了 Javascript,有助于减少文件大小。

但至于上面的最佳实践和答案,不建议在函数标签后使用。

如果您不使用分号,并且想要缩小(就像许多开发人员喜欢在他们的网站提供大量 JavaScript 时所做的那样),您可能会收到各种错误/警告。

【讨论】:

【参考方案4】:

当我缩小我的脚本时,我意识到我需要对以等号开头的函数使用分号。如果你定义一个函数为var,是的,你需要使用分号。

需要分号

var x = function();
var x = new function();
this.x = function();

不需要分号

function x()

【讨论】:

【参考方案5】:

JS Lint 是事实上的约定,它表示函数体后没有分号。请参阅“分号”部分。

【讨论】:

我亲眼目睹了由于缺少分号而失败的函数。我完全不同意将其关闭是一种惯例。虽然 99.99% 的情况下它不会中断,但在某些情况下,我注意到 IE 在没有分号的情况下无法交互 JavaScript。 我的回复仅涉及函数定义,例如问题的两个示例。在这些情况下,在 any 浏览器中,在 any 情况下不需要终止分号。我猜你可能正在考虑函数表达式。它们是完全不同的问题,而不是原始问题中解决的问题。 var myFunction = function(arg) console.log(arg); (function() console.log('完全不相关的函数'); return '看看会发生什么'; ()); @MillsJROSS 我赞同大卫的回应,如果您详细说明遇到的失败,我会很高兴。确实是IE的函数表达式还是bug?【参考方案6】:

这实际上不仅仅是约定或一致性的问题。

我相当肯定在每条语句后放置分号会减慢内部解析器的速度,因为它必须弄清楚语句的结尾在哪里。我希望我有一些方便的数字供您肯定地确认,但也许您可以自己谷歌搜索。 :)

此外,当您压缩或缩小代码时,缺少分号可能会导致脚本的缩小版本无法执行您想要的操作,因为所有空白都消失了。

【讨论】:

这个问题是针对分号是否必须在函数之后,而不是在每个语句之后。我同意您应该在每条语句之后放置分号,而且我看到其他 *** 共识也这么说。 同意,并且未能在函数后放置分号将导致我提到的缩小问题。祝你好运先生。 支持'因为加强缩小问题澄清了我的理解【参考方案7】:

我在函数作为变量声明之后使用它们:

var f = function()  ... ;

但不是在经典风格的定义之后:

function f() 
    ...

【讨论】:

NetBeans 以及其他 IDE 喜欢在函数即变量后看到分号,例如 this.animaton_fun = function () ... ; 但是 - 对于提问者 - 为什么 它在构建步骤中有所帮助。 uglifier脚本看到分号时,不需要在输出文件中添加换行符,如果没有,则会生成换行符,文件会稍大。【参考方案8】:

真的只是取决于你的喜好。我喜欢用分号结束代码行,因为我习惯了 Java、C++、C# 等,所以我在 javascript 中使用相同的编码标准。

虽然我通常不会以分号结束函数声明,但这只是我的偏好。

浏览器会以任何一种方式运行它,但也许有一天他们会提出一些更严格的标准来管理它。

我将编写的代码示例:

function handleClickEvent(e)

     // comment
     var something = true;  // line of code
     if (something)  // code block
     
        doSomething();  // function call
     

【讨论】:

行绝对应该以分号结尾,tho。否则缩小器可能会完全破坏功能 @david:在那种情况下,缩小器肯定坏了吗? 同意。对于具有 C/C++ 背景的人(比如我)来说,这是一种自然的编码方式。它还使代码更具可读性。【参考方案9】:

保持一致!它们不是必需的,但我个人使用它们,因为大多数缩小技术都依赖于分号(例如,Packer)。

【讨论】:

以上是关于为啥我应该在javascript中的每个函数后使用分号?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 每个对数组中的每个int求和的乘法函数

为啥函数的参数对象不是 Javascript 中的数组?

为啥 scala 函数中的块变量在执行内部块后无法更新?

为啥我的列表项调用了它不应该调用的函数?

为啥使用命名函数表达式?

为啥不应该在函数式编程中使用变量赋值