2013-03-01 60 views
0

是以往任何时候都需要在一个函数定义的末尾添加分号像下面是在JavaScript函数的声明永远需要

function helloWorld() { 
    //some code 
}; //note the semicolon here at the end is it ever necessary? Ever 

我有发誓这是可选的朋友分号。我认为它从来不是可选的我从来没有读过关于它在函数结束时是可选的。我从来没有见过任何人做过“除他之外”。分号是可选的。

var hellWorld = function(){ 

}; // the semicolon here it is optional because you are defining a variable this is OK and optional 
+0

而你的朋友会* * *。这是可选的。尤其是在函数声明之后。 – techfoobar 2013-03-01 18:20:15

+3

它不仅是可选的,而且它也是AFAIK“不推荐”(JS中的大多数分号是可选的,但是仍然推荐使用它们)。 – Jon 2013-03-01 18:20:21

+0

在JS中,分号几乎在任何地方都是可选的,因为它不用分号(虽然它可能不是一个好主意,取决于你问的对象)。 – delnan 2013-03-01 18:20:45

回答

5

分号分隔表达式。你可以在一个之后添加任意数量的分号,因为它们会分隔空的语句。

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

该功能后分号是不是“可选”,这是显而易见的冗余。

至于实际上可选的,它们是如此,因为JavaScript会在大多数情况下需要添加分号之前添加分号。这些你应该明确写。迟早你会因缺乏自动分号而感到困惑。

+0

Upvoted。你能通过进一步指定来帮助我吗?在构造函数中,我看到省略了分号。函数C(){}但在其他许多情况下都有分号。我发现的唯一解释是在W3School上。 “\t”分号用于分隔可执行的JavaScript语句。 由于函数声明不是可执行语句,因此以分号结尾并不常见。所以我试图得到一个更好的答案。好像你知道你在说什么。 – 2014-12-31 06:28:32

+0

面对可选的学习正确语法的最好方法是使用linter。试试'JSLint'或'JSHint':这些程序会扫描你的代码并提出改进建议。在使用它们一段时间之后,您将会选择最佳做法。 – slezica 2015-01-01 21:20:03

0

不是必需的。它是隐式插入的,但依赖于隐式插入会导致细微的,难以调试的问题。不要这样做。你比这更好。

有几个地方失踪分号特别危险:

// 1. 
MyClass.prototype.myMethod = function() { 
    return 42; 
} // No semicolon here. 

(function() { 
    // Some initialization code wrapped in a function to create a scope for locals. 
})(); 


var x = { 
    'i': 1, 
    'j': 2 
} // No semicolon here. 

// 2. Trying to do one thing on Internet Explorer and another on Firefox. 
// I know you'd never write code like this, but throw me a bone. 
[normalVersion, ffVersion][isIE](); 


var THINGS_TO_EAT = [apples, oysters, sprayOnCheese] // No semicolon here. 

// 3. conditional execution a la bash 
-1 == resultOfOperation() || die(); 
3

在这种情况下,是的,这是不需要的。

这工作得很好:

function foo() {} var x = "hi"; 

然而,这是一个语法错误:

var foo = function() {} var x = "hi"; 

这将}后罚款与断行,或用分号。您不需要两者 - 通常在分行符或大括号之前插入分号,如果程序在没有它的情况下无效。但在某些情况下,程序仍然有效没有它,但意味着别的东西。所以你必须小心依靠分号插入。

例子:

var x = "foo" 
/foo/.test(x) 

在这里,我想分号插入在第一行的末尾,但得到了烧,因为在我的正则表达式的/也可能是一个除法运算符。所以没有分号插入。事实上,这是无效的,当你到达.不会节省你,var x = "foo" /是一个有效的程序片段,所以没有分号插入。

这就是为什么有些人说“永远不要依赖分号插入”。

但是在函数定义之后,你仍然不需要分号。

+0

此外,即使您不依赖分号插入,仍然可能会因不允许换行符而被咬住的情况,但您认为这是事实,因此您会得到一个你并不期望的分号插入。例如,在'return'关键字之后。 – 2013-03-01 18:41:32

-1

没有必要,但很好的风格。但是,使用缩小器可以消除无关的空白,缩短变量等等,而忽略分号通常会带来问题。

+0

第一个例子是*不*很好的风格。如果人们对ASI有基本的了解,他们可以在大多数地方安全地将他们的代码从他们的代码中排除出去。 – 2013-03-01 18:45:52

+0

...以及无法正确处理分号的缩小器是不值得使用的缩小器。 – 2013-03-01 18:50:29

+0

我遇到至少一个JavaScript缩小器删除换行符的问题,导致丢失分号。但你是对的。 – 2013-03-01 18:52:03