[javascript] 자바 스크립트 변수 정의 : 쉼표와 세미콜론

세미콜론이 아닌 변수 그룹을 선언 할 때 쉼표를 사용할 때의 차이점 및 / 또는 이점은 무엇입니까?

예를 들면 :

var foo = 'bar', bar = 'foo';

var foo = 'bar';
var bar = 'foo';

var첫 번째 예제에서 첫 번째 변수에 키워드 를 지정하면 모든 변수에 걸쳐 지속되므로 둘 다 범위와 관련하여 동일한 최종 결과를 생성한다는 것을 알고 있습니다. 그것은 단지 개인적인 취향입니까, 아니면 어느 쪽이든 수행하면 성능상의 이점이 있습니까?



답변

성능상의 이점은 없으며 개인적인 선택과 스타일의 문제입니다.

첫 번째 버전은 더 간결합니다.


최신 정보:

전송되는 데이터의 양에 관해서는 물론 적을수록 좋지만 var실제 영향을 확인하려면 엄청나게 많은 제거 된 선언 이 필요합니다 .

축소를가 로 첫 번째 예는, 그러나, 더 나은 축소를 위해 도움이됩니다 무언가로 언급 된 다니엘 Vassallo이 코멘트에 지적, 좋은의 minifier은 자동으로 당신을 위해 어쨌든, 그래서 그 점에 영향을주지 않고 무엇이든지 할 것입니다.


답변

Crockford와 다른 사람들을 읽은 후 쉼표로만 변수를 연결하기 시작했습니다. 그런 다음 나중에 쉼표로 변수 정의에서 멈추지 않는 Chrome DevTools 디버거에 정말 짜증이났습니다. 디버거의 경우 쉼표로 연결된 변수 정의는 단일 문이며 여러 var 문은 디버거가 중지 할 수있는 여러 문입니다. 따라서 다음에서 다시 전환했습니다.

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

에:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

이제 디버거 문제를 해결하는 이점은 말할 것도없고 두 번째 변형이 훨씬 더 깔끔하다는 것을 알게되었습니다.

축소자가 있기 때문에 “전선을 통한 코드 감소”인수는 설득력이 없습니다.


답변

나는 var-per-variable표기법을 선호합니다 .

var a = 2
var b = 3

다른 comma-instead-of-another-var표기법에는 다음과 같은 세 가지 단점이 있기 때문입니다 .

1. 유지하기 어렵다
다음 코드를 고려하십시오.

var a = 1,
    b = mogrify(2),
    c = 3

하지만 mogrify는 무엇을합니까? b를 인쇄하여 알아 봅시다 :

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

물건을 부수다

2. 읽기 어렵다

줄 구걸의 var는 새로운 변수가 시작될 것임을 명확하게 전달합니다.

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

도대체 c = 3거기서 뭐하는거야?

3. 일관성이 없음

이걸 고려하세요:

var a = 1,
    b = 2,
    c = 3

함께 var-per-variable모든 선언 동일한 구조를 따릅니다. 함께 comma-instead-of-another-var첫 번째 변수에 다른 사람보다 다른 방식으로 선언됩니다. 예를 들어, for 사이클 내에서 첫 번째 변수를 이동하기로 결정한 경우 선언 중간에 var를 추가해야합니다.

선호도 외에는 주목할만한 대부분의 프로젝트에서 var-per-variable표기법을 사용하는 것 같습니다.


답변

나는 이것이 주로 개인적인 스타일의 문제라는 다른 답변자들의 의견에 동의합니다. 그러나 토론에 “신뢰할 수있는”의견을 가져 오기 위해 Douglas Crockford 가 인기있는 JSLint 도구 웹 사이트에서 다음과 같이 말합니다 .

그러나 JavaScript에는 블록 범위가 없기 때문에 함수의 모든 변수를 함수 맨 위에 선언하는 것이 현명합니다. 함수 당 하나의 var 문을 사용하는 것이 좋습니다. 이는 onevar옵션 으로 시행 할 수 있습니다 .


답변

다른 사람들이 언급했듯이 스타일 선호도입니다. JSLintvar 는 함수 당 하나만 갖도록 지시 할 수 있습니다 ( “Good Parts”를 사용하는 경우). 따라서 JSLint를 사용하여 코드를 확인하는 경우 (나쁜 생각이 아닙니다. IMHO) 후자보다 첫 번째 형식을 더 많이 사용하게됩니다.

반면에 동일한 저자 인 Douglas Crockford코딩 규칙 에서 각 변수를 고유 한 줄에 넣으라고 말합니다 . 따라서 varJSLint를 사용하는 경우 “All one per function”확인란 을 선택 취소 할 수 있습니다. 😉


답변

나는 눈에 띄는 차이가 없다고 생각한다. 내가 염려하는 한 그것은 단지 개인적인 취향 때문이다.

여러 var 선언이 싫어서 일반적으로 다음을 수행합니다.

var
   one
  ,two
  ,three
  ,four
;

더 짧고 더 읽기 쉬우므로 var볼 소음이 없습니다 .


답변

여기에 대한 참조가 없으므로 JavaScript의 기본 사양 인 ECMA-262 사양에 대한 링크가 있습니다. 해당 페이지의 문법은 다음과 같습니다.

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

여기서 얻을 수있는 것은 쉼표를 사용하는 것입니까 아니면 중요하지 않습니다. 어느 쪽이든, 그것은 a로 파싱되고 VariableDeclaration정확히 동일하게 취급됩니다. 스크립트 엔진이 두 선언을 처리하는 방식에는 차이가 없어야합니다. 유일한 차이점은 다른 답변에서 이미 언급 한 것입니다. 더 많은 공간을 절약 VariableDeclarations하고 스크립트를 컴파일 할 때 모든 것을 찾기 위해 문법을 적용하는 데 걸리는 시간의 실질적으로 측정 할 수없는 차이입니다 .