2009-10-11 3 views
8

왜이 return 문을위한 구문 오류가 발생합니까?자바 스크립트 공백 구문 오류

+0

[Javascript의 자동 세미콜론 삽입 (ASI)에 대한 규칙은 무엇입니까?] (0120-388-301) – Bergi

+0

@Bergi는 기술적으로이 질문이이 사본과 중복 될 수 있으며,) 그러나 중점과 "검색 가능성"은 다릅니다 (예 :이 질문을 삭제하지 않으려 고합니다). – drzaus

+0

@drzaus : 중복 폐쇄는 시간 순서를 엄격하게 따를 필요가 없습니다. 우리는 많은 표준적인 질문을했습니다. 나중에 물어 보면 더 높은 품질의 답변을 얻었습니다 :-) 관련성이 높고 관련성이 높은 게시물 (정확한 속임수가 아님)을 링크하고 싶었지만이 질문을 닫지 않았습니다. 또한 닫힌 질문은 삭제되지 않습니다. – Bergi

답변

21

공백에 관한 것이 아니라 JavaScript에 의한 자동 세미콜론 삽입에 관한 것입니다.

ECMAScript를 사양해야

특정 ECMAScript를 문 (빈 문, 변수 명령문, 표현 문, 문을 계속 문, return 문을 중단하고, 문을 던져, 할 일 동안 문) 말한다 세미콜론은 으로 끝납니다. 이러한 세미콜론은 항상 이 원본 텍스트에 명시 적으로 나타날 수 있습니다. 그러나 편의상 특정 상황에서는 소스 텍스트에서 세미콜론을 생략 할 수 있습니다. 이러한 상황은 에 의해 설명되며, 해당 상황에서 코드 토큰 스트림에 세미콜론이 으로 자동 삽입됩니다.

이 함수가 실행 된 후 코드

var FOO = (function($) 
{ 
    return 
    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

이 정의되지 않습니다

var FOO = (function($) 
{ 
    return; // <- JavaScript will insert a semicolon here. 

    {  
     init: function() 
     { 

     } 
    } 
})(jQuery); 

그래서 FOO로 번역됩니다 것을 의미한다.

다른 코드의 경우 JS는 세미콜론을 삽입하지 않으며 올바르게 작동합니다. JS는 리터럴 개체 뒤에 세미콜론을 삽입하므로 정상적으로 작동합니다. [편집 : kagnax에 의해 지적 된 수정]

이것은 항상 세미콜론으로 성명을 종료해야한다는 것을 의미합니다. JS 엔진에 세미콜론 (semicolon)을 삽입하면 디버그하는 데 몇 시간이 걸릴 수있는 매우 미묘한 버그가 발생할 수 있습니다. JSLint과 같은 도구를 사용하면 누락 된 세미콜론을 경고합니다.

+3

사실, 그의 "다른 코드"JS **는 세미콜론을 삽입 할 것입니다. 그러나 객체 리터럴 뒤에 - 인용 된 스펙 섹션에서 설명 된대로 - * ReturnStatement * s ASI에 대한 후보자입니다 :) – kangax

+0

kangax, 나는 그의 다른 문자에도 세미콜론이 없다는 것을 알아 채지 못했습니다. 나는 대답을 업데이트 할 것이다. – SolutionYogi

+0

약간의 convinience, 응? Javascript가 내 코드로 인해 미묘하지만 심오한 수정을하게 될 것이라는 것을 몰랐습니다. 나는이 'convinience'을 원하지 않는다. +1 to basicics 설명 – mfeingold