Javascript의 모든 함수 뒤에 세미콜론을 사용해야하는 이유는 무엇입니까?


282

자바 스크립트에서 함수 뒤에 세미콜론이 포함 된 다른 개발자가 있지만 일부는 그렇지 않았습니다. 가장 좋은 방법은 무엇입니까?

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

또는

function unnecessary(arg) {
  // bunch of code
}

답변:


424

함수 선언 후 세미콜론 은 필요하지 않습니다 .

의 문법 FunctionDeclaration은 다음과 같이 사양에 설명되어 있습니다 .

function Identifier ( FormalParameterListopt ) { FunctionBody }

문법적으로 세미콜론이 필요하지 않지만 왜 그런지 궁금 할 수 있습니까?

세미콜론은 명령문 을 서로 분리하는 역할을 하며 a FunctionDeclaration명령문 이 아닙니다 .

FunctionDeclarations코드가 실행 되기 전에 평가 됩니다. 호이 스팅 은 이 동작을 설명하는 데 사용되는 일반적인 단어 입니다.

ECMAScript 사양에 설명 된 함수 명령문이 없기 때문에 "함수 선언"및 "함수 명령문"이라는 용어는 종종 서로 바꿔서 잘못 사용됩니다. 비표준입니다.

그러나 다음과 같이 세미콜론을 사용하는 경우 항상 권장됩니다 FunctionExpressions.

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

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

위 예제에서 첫 번째 함수 다음에 세미콜론을 생략하면 원하지 않는 결과가 나타납니다.

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

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

첫 번째 함수는 두 번째 함수를 둘러싼 괄호 Arguments가 함수 호출의 것으로 해석되므로 즉시 실행됩니다 .

추천 강의 :


2
명확히하기 위해 편집 된 기사는 함수 표현식
CMS

1
ECMA에 완전히 익숙하지는 않지만 이것이 제가 사용하는 표준입니다. 좋은 소식입니다. 온라인에서 볼 수있는 대부분의 튜트와 DL 샘플은 그 표준을 사용하므로 방금 적응했습니다.
regex

1
여기서 혼동의 일부는 "무시되기 때문에 허용된다"는 영어 단어가 부족하여 영향을받을 수 있습니다. 우리는 "선택적"이라고 말하지만, 선언 후 세미콜론을 포함하지 않는 것은 문장 뒤에 세미콜론을 포함하지 않는 것과 같은 범주에 속한다는 것을 암시하기 때문에 오해의 소지가 있습니다. 후자는 완전히 다른 의미에서 선택 사항입니다. 파서는 생략 한 세미콜론을 추가 하기 때문이며, 이 경우 파서는 포함 된 세미콜론을 무시 하기 때문 입니다. 다시 말하면, 하나가 선택 사항이라면 8도 마찬가지 입니다.
세미콜론

"Named function expressions demystified"링크는 이제 죽은 URL로 연결됩니다. 웹 아카이브에는 여기에 사본이 있습니다. web.archive.org/web/20100426173335/http://yura.thinkweb2.com/…
Tony

마지막 예는 대단합니다. 이 경우 세미콜론을 생략하면 매우 이상하고 디버그하기 어려운 버그가 발생합니다. 진심으로 투표.
Yan Yankowski

38

변수로 함수 선언 후에 사용합니다.

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

그러나 고전적인 스타일 정의 후에는 아닙니다.

function f() {
    ...
}

NetBeans와 다른 IDE는 this.animaton_fun = function () {...};
랜스 클리블랜드

6
하지만 질문자에게 ?
Luke

빌드 단계에서 도움이됩니다. uglifier 스크립트가 세미콜론을 볼 때 출력 파일에 줄 바꿈을 추가 할 필요가 없으면 줄 바꿈이 생성되고 줄 바꿈이 생성되고 파일이 약간 커집니다.
autoboxer

20

JS Lint 는 사실상의 규칙이며 함수 본문 뒤에 세미콜론이 없다고 말합니다. "세미콜론" 섹션을 참조하십시오 .


10
나는 세미콜론이 부족하여 실패한 기능을 직접 목격했습니다. 나는 그것을 떠나는 것이 관례라는 것에 완전히 동의하지 않습니다. 99.99 %의 시간이 중단되지는 않지만 IE가 세미콜론없이 JavaScript를 인터 페트 할 수없는 특정 상황이 있습니다.
MillsJROSS 2009

8
내 답변은 질문의 두 예제와 같은 함수 정의 만 처리합니다. 이 경우 어떤 상황 에서도 어떤 브라우저 에서도 종료 세미콜론이 필요하지 않습니다 . 함수 표현식을 생각하고있을 것 같습니다. 그것들은 완전히 다른 문제이며 원래의 질문에서 다루어지지 않았습니다.
David Hedlund

var myFunction = 함수 (arg) {console.log (arg); } (function () {console.log ( '완전히 관련이없는 함수'); return '어떻게되는지보기';} ());
Maciej Krawczyk

@MillsJROSS 나는 David의 두 번째 반응을 보았고, 당신이 겪은 실패를 자세히 설명하면 기쁠 것입니다. 실제로 함수 표현이나 IE의 버그입니까?
wlnirvana

7

일관성을 유지하십시오! 그것들은 필요하지 않지만 대부분의 축소 기술은 세미콜론 (예 : Packer )에 의존하기 때문에 개인적으로 사용합니다 .


5

실제로 당신의 취향에 달려 있습니다. Java, C ++, C # 등에 익숙하기 때문에 세미콜론으로 코드 줄을 끝내고 싶습니다. 그래서 자바 스크립트에서 코딩에 동일한 표준을 사용합니다.

나는 일반적으로 세미콜론으로 함수 선언을 끝내지는 않지만 내 선호 사항입니다.

브라우저는 어느 쪽이든 작동하지만 언젠가는이를 규제하는 더 엄격한 표준을 제시 할 것입니다.

내가 쓸 코드의 예 :

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

1
줄은 세미콜론으로 끝나야합니다. 그렇지 않으면 minifier 완전히 기능을 깰 수
데이비드 Hedlund는에게

9
@ david :이 경우 축소 기가 깨졌습니까?
DisgruntledGoat

동의했다. C / C ++ 배경에서 온 사람들을위한 자연스러운 코딩 방법입니다. 또한 코드를 더 읽기 쉽게 만듭니다.
Anshuman Manral

3

실제로는 규칙이나 일관성 문제가 아닙니다.

나는 것을 상당히 확신 하지 가 문장의 끝이 어디 있는지 파악하기 때문에 내부 파서 아래 모든 문 감속 후 세미콜론을 배치. 나는 당신이 긍정적으로 그것을 확인할 수있는 편리한 번호를 가지고 있었으면하지만, 당신은 그것을 직접 구글 할 수 있습니다. :)

또한 코드를 압축하거나 축소 할 때 세미콜론이 없으면 모든 공백이 없어져 원하는 작업을 수행하지 않는 스크립트 버전이 축소 될 수 있습니다.


3
세미콜론이 모든 진술이 아니라 기능을 수행해야하는지에 대한 문제가 제기되었습니다. 나는 모든 진술 후에 세미콜론을 배치해야한다는 데 동의하며 다른 스택 오버 플로우 합의가 동일하게 말하는 것을 보았습니다.
macca1 2009

1
동의하고 함수 뒤에 세미콜론을 넣지 않으면 언급 한 축소 문제가 발생합니다. 행운을 빈다
메이슨

Upvote '
최소화

1

스크립트를 축소 할 때 등호로 시작하는 함수에 세미콜론을 사용해야한다는 것을 깨달았습니다. 함수를 var로 정의하면 예, 세미콜론을 사용해야합니다.

세미콜론이 필요합니다

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

세미콜론 필요 없음

function x(){}

0

단순한:

;함수 중괄호가 끝나면 세미콜론을 남겨 두는 것이 좋습니다 . 그들은 몇 년 동안 모범 사례로 간주되었습니다.

항상 사용하는 것의 한 가지 장점은 JavaScript를 축소하려는 경우입니다.

Javascript를 축소함에 따라 파일 크기를 약간 줄이는 데 도움이됩니다.

그러나 위의 모범 사례와 답변은 함수 태그 뒤에 사용하지 않는 것이 좋습니다.

세미콜론을 사용하지 않고 (자신의 사이트가 많은 JavaScript를 제공하는 경우를 좋아하는 많은 개발자와 같이) 축소하려는 경우 모든 종류의 오류 / 경고를 얻을 수 있습니다.


0

함수를 사용한 후 세미콜론을 사용할 필요가 없는지, 프로그램에서 오류를 일으키지 않습니다. 그러나 코드를 축소하려는 경우 함수 뒤에 세미콜론을 사용하는 것이 좋습니다. 예를 들어 아래 코드와 같은 코드가 있다고 가정하십시오.

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

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

둘 다 축소하면 다음과 같이 출력됩니다.

의견은 단지 설명을위한 것입니다.

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

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.