중괄호 배치에 따라 결과가 다른 이유는 무엇입니까?


119

이 기사 에서 가져온 아래 코드 스 니펫 은 중괄호의 위치를 ​​한 번만 변경하여 다른 결과를 생성 하는 이유는 무엇 입니까?

여는 중괄호 {가 새 줄에 있으면을 test()반환 undefined하고 "no-it broke : undefined"가 경고에 표시됩니다.

function test()
{
  return
  { /* <--- curly brace on new line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}

중괄호가 같은 같은 라인에있는 경우 return, test()객체를 반환하고, "환상적인"경고한다.

function test()
{
  return { /* <---- curly brace on same line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}


이후의 세미 삽입 의미 return는 다른 위치와 약간 다르며 줄 바꿈은 "중류"보다 해당 지점에서 "더 많은 것을 의미"합니다.
dandavis 2015-06-03

답변:


165

이것이 자바 스크립트의 함정 중 하나 인 자동 세미콜론 삽입입니다. 세미콜론으로 끝나지 않지만 명령문의 끝일 수있는 줄은 자동으로 종료되므로 첫 번째 예제는 다음과 같이 효과적으로 보입니다.

function test()
{
  return; // <- notice the inserted semicolon
  { 
    javascript: "fantastic"
  };
}

세미콜론 삽입을 언급하는 Douglas Crockford의 JS 스타일 가이드를 참조하세요 .

두 번째 예제에서는 속성 javascript과 그 값을 가진 객체 (중괄호로 작성)를 반환합니다 "fantastic". 사실상 다음과 같습니다.

function test() {
    var myObject = new Object();
    myObject.javascript = "fantastic";
    return myObject;
}

5
재미있는 사실은 : 일부 엔진에서 당신은 자동 삽입 세미콜론을 주석 처리 할 수
크리스토퍼 Tarquini에게

1
@ChrisT : 뭐? 어느 것? 이것은 어디에서나 탐구됩니까?
Sean McMillan

1
@SeanMcMillan 나는 그것에 관한 기사를 확실히 읽었지만 빠른 검색에서 그것들을 찾을 수없는 것 같습니다. 이전 버전의 크롬에서 숨겨진 세미콜론 을 넣은 return /*다음 */{ 효과적으로 주석 처리 한다는 것을 기억합니다 . 그래도 적용되는지 확실하지 않음
Christopher Tarquini

2
이러한 기이 한 점 때문에 저는 10 년 전에 자신에게 약속했습니다. 웹에서 멀리 떨어져 있습니다! Interwebs가 사라지 길기도했습니다 ... 불행히도 계획대로 진행되지 않았고 이제 이러한 문제도 해결해야합니다. Karma is ab * tch :)
Jowen 2014

1
저는 자바 스크립트에서 세미콜론에 대해 종교적으로 반대하는 사람들을 보았습니다. 저는 항상 세미콜론을 넣지 않음으로써 절약되는 추가 시간으로 무엇을하는지 궁금해했습니다.
Iman Mohamadi

9

자바 스크립트는 문장 끝에 세미콜론이 필요하지 않지만, 단점은 세미콜론이 어디에 있는지 추측해야한다는 것입니다. 대부분의 경우 이것은 문제가되지 않지만 때로는 의도하지 않은 세미콜론을 발명합니다.

이에 대한 내 블로그 게시물의 예 ( Javascript – 거의 줄 기반이 아님) :

다음과 같이 코드를 포맷하면 :

function getAnswer() {
   var answer = 42;
   return
      answer;
}

그러면 다음과 같이 해석됩니다.

function getAnswer() {
  var answer = 42;
  return;
  answer;
}

return 문은 매개 변수가없는 형식을 취하고 인수는 자체 문이됩니다.

코드도 마찬가지입니다. 이 함수는 다음과 같이 해석됩니다.

function test()
{
  return;
  {
    javascript : "fantastic"
  };
}

3

개인적으로 가독성을 위해 Allman 스타일을 선호합니다 (K & R 스타일 대비).

대신에…

function test() {
  return {
    javascript : "fantastic"
  };
}

나는 ...

function test() 
{
  var obj =
  {
    javascript : "fantastic"
  };

  return obj;
}

그러나 이것은 해결 방법입니다. 나는 그것과 함께 살 수있다.


3
주류에서 벗어나는 개인적 선호도를 피해야한다고 생각합니다. 우리는 가독성을 증가 일관성을 촉진 대다수의 선택을 따라야합니다
Jowen

1
그의 코드는 K & R보다 더 읽기 쉽습니다. 당신이 "읽기"을 의미 할 때 꽤 주관적
밀기울

나도 Allman을 선호하지만 ASI 때문에 물건을 반환해야 할 때 세미를 반환과 같은 줄에 둡니다. 나는 하나의 "var x ="줄을 추가하는 것보다 이것을 선호합니다 ...
Mik

1

자바 스크립트가 ";"를 가장 자주 사용하기 때문입니다. 각 줄의 끝에서, 기본적으로 같은 줄에 return {을 입력하면 자바 스크립트 엔진은 더 많은 것을 볼 수 있고 새 줄에 ";"을 넣는 것을 잊었다 고 생각하고이를 대신 입력합니다.


1
cichy, Darin 및 Ivo의 답변이 왜 반대표를 받았는지 모르겠습니다.
BoltClock

1

여기에서 중괄호는 새 개체의 구성을 나타냅니다. 따라서 코드는 다음과 같습니다.

function test() {
  var a = { javascript : "fantastic" };
  return a;
}

다음과 같이 작성하면 작동합니다.

function test() {
  var a = { javascript : "fantastic" };
  return; // ; is automatically inserted 
      a;
}

더 이상 작동하지 않습니다.


0

문제는 실제로 위에서 설명한 세미콜론 주입입니다. 이 주제에 대한 좋은 블로그 게시물을 읽었습니다. 이 문제와 자바 스크립트에 대해 더 많이 설명합니다. 또한 좋은 참고 자료도 포함되어 있습니다. 여기에서 읽을 수 있습니다.


예, 나도 읽었습니다. ater reading 여기에서 js의 마스터 마인드가 더 잘 설명하도록 요청합니다.
JustLearn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.