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

IT技术 javascript syntax
2021-02-08 11:27:44

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

function weLikeSemiColons(arg) {
   // bunch of code
};

或者

function unnecessary(arg) {
  // bunch of code
}
6个回答

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

a 的语法FunctionDeclaration规范中描述为:

function Identifier ( FormalParameterListopt ) { FunctionBody }

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

分号用于将语句彼此分开,而 aFunctionDeclaration不是语句

FunctionDeclarations在代码进入执行之前评估提升用来解释这种行为常用词

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

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

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

(function () {
  //...
})();

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

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

(function () {
  //...
})();

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

推荐讲座:

链接“命名函数表达式揭秘”现在链接到一个死网址,网络档案在这里有一个副本:web.archive.org/web/20100426173335/http : //yura.thinkweb2.com/...
2021-03-14 11:27:44
这里的一些混淆可能是由于缺乏一个好的英语单词“允许,因为它会被忽略”。我们退回说“可选”,但这是误导,因为它表明声明后不包括分号与声明后不包括分号属于同一类别。后者在完全不同的意义上是可选的:这是因为解析器将添加您省略的缺少的分号,而在这种情况下,这是因为解析器将忽略您包含的分号换句话说:如果一个是可选的,那么八个也是
2021-03-15 11:27:44
对 ECMA 并不完全熟悉,但这也是我使用的标准。好帖子。我在网上看到的大部分 tuts 和我 DL 的代码示例都使用该标准,所以我刚刚适应了它。
2021-03-21 11:27:44
最后一个例子很好。在这种情况下省略分号会导致非常奇怪且难以调试的错误。全心全意投票。
2021-03-28 11:27:44
编辑以澄清,该文章谈到了函数表达式
2021-04-04 11:27:44

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

var f = function() { ... };

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

function f() {
    ...
}
NetBeans 以及其他 IDE 喜欢在函数变量后看到分号,例如 this.animaton_fun = function () { ... };
2021-03-20 11:27:44
它在构建步骤中有所帮助。当 uglifier 脚本看到分号时,它不需要在输出文件中添加换行符,如果没有,则会生成一个换行符并且文件会稍微大一些。
2021-03-29 11:27:44
但是 - 对于提问者 -为什么
2021-03-31 11:27:44

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

@MillsJROSS 我支持大卫的回答,如果您详细说明遇到的失败,我会很高兴。确实是IE的函数表达式还是bug?
2021-03-20 11:27:44
我亲眼目睹了一个由于缺少分号而失败的函数。我完全不同意放弃它是一种惯例。虽然 99.99% 的时间它不会中断,但在某些情况下,我注意到 IE 无法在没有分号的情况下解释 JavaScript。
2021-03-28 11:27:44
我的回答仅涉及函数定义,例如问题的两个示例。在这些情况下,任何浏览器在任何情况下都不需要终止分号我猜你可能会想到函数表达式。它们是完全不同的问题,而不是原始问题中提到的问题。
2021-04-01 11:27:44
var myFunction = function(arg) { console.log(arg); } (function() { console.log('完全不相关的函数'); return '看看会发生什么'; }());
2021-04-03 11:27:44

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

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

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

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

我会写的代码示例:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}
行绝对应该以分号结尾,tho。否则缩小器可能会完全破坏功能
2021-03-21 11:27:44
@david:在那种情况下,压缩器肯定坏了?
2021-03-27 11:27:44
同意。对于来自 C/C++ 背景的人(比如我)来说,这是一种自然的编码方式。它还使代码更具可读性。
2021-04-09 11:27:44