2008-09-03 3 views
25

다음 코드는 문자가 할당되는 개체를 설명하지만, 나중에 어떤 세미콜론 :JavaScript에서 객체 리터럴 지정 후에 세미콜론이 필요합니까?

var literal = { 
    say: function(msg) { alert(msg); } 
} 
literal.say("hello world!"); 

이 법적으로 나타나고, (적어도 파이어 폭스   3) 경고를 발행하지 않습니다. 이것은 완전히 합법적입니까, 아니면 허용되지 않는 엄격한 버전의 JavaScript가 있습니까?

특히 미래의 호환성 문제에 대해 궁금합니다. "정확한"JavaScript를 작성하고 싶습니다. 기술적으로 세미콜론을 사용해야하는 경우, 사용하고 싶습니다.

+0

저는 IE에서 깨질 것이라고 확신합니다. 유효한 자바 스크립트 일 수도 있지만 어쨌든 세미콜론을 추가해야 할 수도 있습니다. –

+1

세미콜론은 선택 사항이지만 YUI Compressor와 같은 JavaScript 최소화기를 통해 실행하면 코드가 유효하지 않게됩니다. 따라서 항상 세미콜론을 포함하는 것이 좋습니다. – Ricky

답변

33

기술적으로 JavaScript는 많은 경우 선택적으로 세미콜론을 사용합니다.

하지만 일반적으로 모든 문장의 끝에 사용하십시오. 왜? 왜냐하면 스크립트를 압축하고 싶다면 무수히 많은 좌절로부터 벗어날 수 있기 때문입니다.

자동 세미콜론 삽입은 통역사에 의해 수행되므로 을 선택할 수 있습니다. 의견에서 누군가가 그 주장했다 누군가가

Semicolons are not optional with statements like break/continue/throw

그러나 올바르지 않습니다. 그들은 선택 사항입니다. 실제로 일어나고있는 것은 라인 종결자가 자동 ​​세미콜론 삽입에 영향을 미친다는 것입니다. 그것은 미묘한 차이입니다.

For convenience, however, such semicolons may be omitted from the source text in certain situations. These situations are described by saying that semicolons are automatically inserted into the source code token stream in those situations.

JSLint 깨끗하고 깔끔한 자바 스크립트를 유지하는

0

사용 JSLint는 말한다 :

Error:

Implied global: alert 2

Problem at line 3 character 2: Missing semicolon.

}

+1

JSLint의 문제점은 Douglas Crockford가 세미콜론을 필수로 사용해야한다고 생각한 점입니다. 따라서 경고. – staticsan

+4

@staticsan - 그것은 단지 개인적인 믿음이 아닙니다. 모든 줄의 끝에 세미콜론을 사용하면 js 파일을 단일 행 파일로 축소 할 수 있습니다. – Geoff

-1

이 유효하지 않은 (여기서

세미콜론 삽입에 대한 표준의 나머지 부분입니다 아래의 설명 참조) JavaScript 코드는 할당이 일반 문이므로

과 다를 수 없습니다.
var foo = "bar"; 

JavaScript 인터프리터가 구문 오류를 수정하기 위해 세미콜론을 추가하려고 시도하기 때문에 세미콜론을 생략 할 수 있지만 이는 불필요한 단계입니다. 엄격한 모드는 모르지만 자동화 된 파서 또는 압축기/난독 처리자가 세미콜론을 필요로한다는 것을 알고 있습니다. 당신이 올바른 자바 스크립트 코드를 작성해야 할 경우

, ECMA 스크립트 사양, http://www.ecma-international.org/publications/standards/Ecma-262.htm에 따르면

:-) 세미콜론 쓰기, 세미콜론은 자동으로없는 경우에 삽입됩니다. 이것은 스크립트 작성자에게는 필요하지 않지만 인터프리터에 필요하다는 것을 의미합니다. 즉, 원래 질문에 대한 대답은 '아니오'이며 스크립트 작성시 필요하지는 않지만 다른 사람이 지적한 바와 같이 여러 가지 이유로 권장됩니다.

0

세미콜론은 필요하지 않습니다. 어떤 사람들은 자바 스크립트가 자동으로 줄 바꿈되도록 허용하는 대신 세미콜론으로 끝내는 관습을 따르기를 선택합니다. 그러나 어느 방향으로 나아가는 그룹을 찾을 수있을 것입니다.

"올바른"JavaScript를 쓰고 싶다면 javascript.options.strict (about:config을 통해 액세스)을 true로 설정하여 Firefox에서 테스트 해 볼 것을 제안합니다.모든 것을 포착하지는 못 하겠지만 자바 스크립트 코드가 더 잘 준수하는지 확인하는 데 도움이됩니다.

13

YUI Compressor와 dojo shrinksafe는 완전한 JavaScript 파서를 기반으로하므로 세미콜론없이 완벽하게 작동해야합니다. 그러나 Packer와 JSMin은 그렇지 않습니다.

문장의 마지막에 항상 세미콜론을 사용하는 또 다른 이유는 실수로 두 문장을 결합하여 매우 다른 것을 만들 수있는 경우입니다. 당신이 일반적인 기술로 문을 따르는 경우 예를 들어, 폐쇄 사용 범위를 만들 :

var literal = { 
    say: function(msg) { alert(msg); } 
} 
(function() { 
    // .... 
})(); 

파서 함수 호출로 브래킷을 해석 할 수 있습니다를, 여기에 유형 오류의 원인이 있지만, 다른 상황에서 그것을 할 수 추적하기가 까다로운 미묘한 버그가 발생합니다. 또 다른 흥미로운 사고는 다음 문장이 정규 표현식으로 시작하면 파서는 첫 번째 슬래시가 나눗셈 기호라고 생각할 수 있습니다.

+1

나는 최근에 비슷한 문제가 발생했다. 이는 매우 가능성있는 시나리오이며 일관된 세미콜론 사용에 대한 좋은 논거입니다. +1 –

2

이 경우 문 끝의 세미콜론이 필요하지 않습니다. 결론은 같지만 추론은 꺼져 있습니다.

JavaScript에는 세미콜론이없는 것이 "선택 사항"입니다. 오히려 자동 세미콜론 삽입에 대한 엄격한 규칙이 있습니다. 세미콜론은 break, continue 또는 throw과 같은 명령문에서는 옵션이 아닙니다. 자세한 내용은 ECMA Language Specification을 참조하십시오. 구체적으로는 11.9.1, rules of automatic semicolon insertion입니다.

7

JavaScript 인터프리터는 "세미콜론 삽입"이라고하는 것을 수행하므로 세미콜론이없는 행이 유효하면 명령문의 끝 부분에 세미콜론이 자동으로 추가되며 오류는 발생하지 않습니다.

var foo = 'bar' 
// Valid, foo now contains 'bar' 
var bas = 
    { prop: 'yay!' } 
// Valid, bas now contains object with property 'prop' containing 'yay!' 
var zeb = 
switch (zeb) { 
    ... 
// Invalid, because the lines following 'var zeb =' aren't an assignable value 

너무 복잡하지는 않지만 분명히 뭔가 잘못 됐을 때 오류가 발생합니다. 그러나 오류가 이 아닌이 발생하지만 세미콜론 삽입으로 인해 명령문이 의도 한대로 실행되지 않는 경우가 있습니다. 내가 설정하는 알고있는 방법이 없기 때문에 (이런

return { 
    prop: 'yay!' 
} 
// The object literal gets returned as expected and all is well 
return 
{ 
    prop: 'nay!' 
} 
// Oops! return by itself is a perfectly valid statement, so a semicolon 
// is inserted and undefined is unexpectedly returned, rather than the object 
// literal. Note that no error occurred. 

버그 사냥에 강합니다 어려울 수 있습니다 당신은 을 보장 할 수는 없지만이 일이 결코 : 객체를 반환하도록되어 기능을 고려 세미콜론 삽입을 제외하고) 세미콜론을 사용하여 의도를 분명하게 할 때 이러한 종류의 버그를 쉽게 식별 할 수 있습니다. 그것과 명시 적으로 세미콜론을 추가하는 것은 일반적으로 좋은 스타일로 간주됩니다.

처음에는이 Douglas Crockford's 간결하고 간명 한 책 "JavaScript: The Good Parts"을 읽을 때이 잠자는 가능성을 알게되었습니다. I 매우 좋습니다.

관련 문제