5

Stefanov의 JS Design Patterns 책에서 그는 "하나의 var 문을 사용하고 여러 변수를 쉼표로 구분하여 선언합니다"라고 쓰고 다음과 같이 "단일 var"패턴 예제를 제공합니다.Javascript의 단점 "단일 var 패턴"

function func() { 
    var a = 1, 
     b = 2, 
     sum = a + b, 
     myobject = {}, 
     i, 
     j; 

스테파노는 추가로 기록 :

  • 는 "그것은 또한 당신이 그것을 선언 할 때 초기 값으로 변수를 초기화하는 것이 좋습니다."
  • "앞의 코드에서 sum = a + b의 경우와 같이 선언 할 때 실제 작업을 수행 할 수도 있습니다."

    var html = '{purchaseQty}<br>FR:&nbsp; {fromLoc}' 
        ,tpl = new Ext.XTemplate(html) 
        ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim() 
        ,srcSupLoc = record.get('SRC_SUP_LOC').trim() 
        ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc 
        ,tplCfg = { 
         purchaseQty: purchaseQty 
         ,fromLoc: fromLoc 
        }; 
    

    : 이제 다음과 같이

나는 하나의 VAR 패턴 변수의 동일한 수를 선언하지만, "선언시 실제 작업"꽤 많은 일을, 어떤 코드가 선언시 실제 작업을 너무 많이하는 것의 단점은 무엇입니까? BTW 나는이 코드를 Javascript single var pattern. Am I overloading it?의 정확한 복제본으로 생각하지 않습니다. 일반적인 코드 단점보다는 일반적인 단점에 대해 묻기 때문입니다.

나는 일반적인 불리한 점이 오류를 검사 할 수 없다는 것을 알 수 있다고 생각한다. 예를 들어 내 예제에서 record.get에서 기대되는 문자열에 대해 trim()을 호출하는 경우와 같이 undefined가 반환되면 "can '정의되지 않은 객체에 대한 메소드 호출'(또는 그것이 무엇이든)이 던져 질 것입니다. 아무도 다른 생각을 할 수 있습니까?

+0

'trim()'의 문제는 전달되는 문자열이 문자열인지 아닌지를 확인하는 자체 trim 함수를 작성할 수 있습니다. – slebetman

+3

@slebetman - 당신은 함수가 필요 없다 :'(record.get ('SRC_SUP_LOC') || "") .trim()'(질문에 따라'.get 문자열 또는 정의되지 않음/널). – nnnnnn

답변

4

모든 변수를 범위의 맨 위에, 즉 함수의 시작이나 전역 코드의 시작 부분에 선언하는 것이 좋습니다. 나는 그것에 동의한다.

선언 할 때 초기 값을 제공하는 한, 나는 그것을 더 많은 지침으로 생각합니다. 일반적으로 입니다. 좋은 계획이며, 단순한 값에 대해서는 확실히 작동하지만, 때로는 초기 값은 더 복잡한 계산이 끝날 때까지는 알 수없는 경우가 있습니다.이 경우에는 결코 술에 사용되지 않는 기본값을 제공하지 않습니다. 어떤 가치를 제공하는 것. 때로는 너무 지저분 해 지기도합니다.

또한 루프 인덱스 변수를 선언 할 때 초기 값을 제공하지 않습니다. 루프의 시작 부분에 값을 할당하는 것이 훨씬 명확합니다.

이미 지적했듯이 예외를 처리해야하는 경우 등등 나중에 예외를 처리해야합니다.

단지 많은 상식을 사용하십시오. 많은 변수가있는 경우 var 문을 읽을 수 없으므로 나중에 함수의 일부로 초기화를 옮길 수 있습니다.

나를 위해 귀하의 예제 코드는 괜찮습니다. 그러나 더 많은 것을 추가해야한다면, 조밀 한 블록에있는 많은 코드로 인해 변수 이름을 쉽게 선택할 수 없기 때문에 읽기가 더 어려워 질 것입니다 하지만 - 그리고 이것은 분명히 취향의 문제 - 당신은 약간의 공백을 추가 할 수 있습니다

var html  = '{purchaseQty}<br>FR:&nbsp; {fromLoc}' 
    ,tpl  = new Ext.XTemplate(html) 

    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim() 
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()  
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc 

    ,tplCfg = { 
     purchaseQty: purchaseQty 
     ,fromLoc: fromLoc 
    }; 

5

저는 개인적으로 Douglas Crockford와 의견을 같이합니다. 그러나이 기능을 사용하지 않는 것에 감사드립니다. 함수 상단에있는 vars를 선언하는 것이 JavaScript에 블록 범위가 없으므로 가장 적합합니다. JSLint site에서

는 :

블록 범위와 언어에

, 보통 변수는 처음 사용의 사이트에서 선언하는 것이 좋습니다. 그러나 JavaScript 에는 블록 범위가 없기 때문에 함수의 모든 부분에 함수의 변수를 선언하는 것이 현명합니다. 함수 당 하나의 var 문을 사용하는 것이 좋습니다.

유일한 단점은 C 또는 C 기반 배경에서 오는 사람이 코드를 읽기 쉽지 않다는 것입니다.

나는 Crockford 팬 보이처럼 들릴지 모르지만, 나는 recommend this talk on coding style이 될 것이며 왜 때로는 당신의 두뇌가 (언어에 따라) 코드 구조로 당신의 마음을 지배해야하는지.

+2

+1 "자바 스크립트, 프로그래밍 스타일 및 당신의 두뇌"를 언급. 나는 그 이야기를 좋아한다 :-) –

+1

나와 함께 Crockford fanboi처럼 들리는 것에 대해 걱정하지 마라. 2003 년 comp.lang.javascript *에서 자신의 시그 (SIG)에 링크 된 JSON을 발견했습니다. –

0

합니다 (= 가입 한 라인, 또는 빈 라인 그룹 관련 변수, 또는 둘 다). 이것은 꽤 오래되었고 더 이상 완전히 관련이 없으므로 es6 세계에서 여기 온 사람들에게 이제는 블록 스코프가 있음을 지적하는 것이 유용합니다 ing.

호이 스팅 (hoisting)은 모든 변수가 선언 된 변수를 함수 범위의 맨 위에 배치하지만 때로는 변수가 특정 블록에서만 사용된다는 것을 알기도합니다. 어떤 경우에는 const가 가장 좋은 생각 인지를 변경하지 마십시오.

관련 문제