JavaScript에서 여러 변수 선언


334

JavaScript에서는 다음과 같이 여러 변수를 선언 할 수 있습니다.

var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

... 또는 이렇게 :

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;

한 방법이 다른 방법보다 낫거나 빠릅니까?


6
에 관해서는 빠르고 , 사용 이 jsperf을 나는 하나의 방법 또는 기타를 사용하여 일관된 속도 이득을 볼 수 없었다.
— Majid Fouladpour

답변:


345

첫 번째 방법은 유지 관리가 더 쉽습니다. 각 선언은 한 줄에있는 단일 명령문이므로 선언을 쉽게 추가, 제거 및 재정렬 할 수 있습니다.

두 번째 방법으로 var키워드와 세미콜론이 포함되어 있기 때문에 첫 번째 또는 마지막 선언을 제거하는 것은 성가신 일 입니다. 새 선언을 추가 할 때마다 이전 줄의 세미콜론을 쉼표로 변경해야합니다.


67
축소하거나 나중에 포장 할 것으로 예상되는 코드를 작성하는 경우 두 번째 방법으로 압축기 (YUI 압축기와 같은)가보다 축소 된 버전을 제공 할 수 있습니다. 크기가 고려 사항이라면 가능한 한 많은 JSLint 제안을 따르는 것이 좋습니다.
— 레인

36
jslint는 두 번째 방법이 더 의롭다 고 주장하지만 나는 동의하지 않습니다.
— ThatGuy

29
두 번째 방법은 미세 최적화입니다. 모든 var 선언은 한 번에 하나씩이 아니라 한 번에 처리됩니다. 최신 브라우저 / 현대 컴퓨터에서는 그다지 중요하지 않습니다.
— webnesto

18
@ 0xc0de : 한 문장에서 모든 변수를 "효율적인"것으로 선언 한 증거를보고 싶습니다. 몇 바이트 만 절약하면 효율성을 측정 할 수 있습니다. 그러나 가독성과 유지 관리 성을 고려할 때 특히 최신 브라우저는 사전 실행 단계에서 범위의 모든 변수를 수집하고 초기화하기 때문에 조기 최적화가 일반적으로 잘못된 방법이라는 것을 알 것입니다. 개인적으로 변수를 한 줄이나 문장으로 선언하면 코드를 더 빨리 이해하고 오류가 발생하기 쉽습니다.
— ogradyjd

9
효율성과 관련하여 uglifyjs와 Google 클로저 컴파일러는 자동으로 순차적 var 문을 하나로 스쿼시하여 해당 지점을 렌더링합니다.
— bhuber

215

유지 관리 성 외에도 첫 번째 방법은 우발적 글로벌 변수 생성 가능성을 제거합니다.

(function () {
var variable1 = "Hello World!" // semicolon is missed out accidently
var variable2 = "Testing..."; // still a local variable
var variable3 = 42;
}());

두 번째 방법은 덜 관대하지만 :

(function () {
var variable1 = "Hello World!" // comma is missed out accidently
    variable2 = "Testing...", // becomes a global variable
    variable3 = 42; // a global variable as well
}());

4
좋은 지적. 짧으면 한 줄에 쓰면이 문제를 피할 수 있습니다 var variable1 = "Hello World!", variable2 = "Testing...", variable3 = 42;. 실종 ,은 추락 할 것이나 위험하다는 데 동의합니다
— Aram Kocharyan

14
엄격 모드를 사용하는 경우 어쨌든 이와 같은 전역을 만들 수 없습니다.
— Danyal Aytekin

1
나는 한 줄에 여러 변수를 선언하는 것을 좋아합니다. 그러나 실수로 전역 변수를 선언하는 것은 정말 위험합니다. 메모리 누수를 찾아내는 동안 쉼표 대신 세미콜론을 사용했기 때문에 실수로 여러 전역 변수를 한 번에 선언 한 여러 인스턴스를 발견했습니다.
— smabbott

+1은 하루 반만 보내고이 두 선언 사이에 왜 문서화되지 않은 차이가 있는지 궁금해지기 시작했습니다. 그런 다음이 답변을 읽고 코드를주의 깊게 확인하고 실수를 찾으십시오. 휴일이 필요합니다 ...
— Giedrius

1
내 텍스트 편집기는 Possible Fatal Error코마가 빠졌을 때 나에게 만세를 준다!

33

조직 마다 범위 당 하나의 var명령문 을 사용하는 것이 일반적 입니다. 모든 "범위"가 유사한 패턴을 따르는 방식으로 코드를 더 읽기 쉽게 만듭니다. 또한 엔진은 어쨌든 모두를 "상승"합니다. 따라서 선언을 함께 유지하면 실제로 더 밀접하게 일어날 일을 모방합니다.


6
동일한 'var'선언을 공유하지 않고도 선언을 함께 유지할 수 있습니다. 나는 jslint (귀하의 링크)에 주어진 설명을 이해하고 동의하지만 결론을 공유하지는 않습니다. 위에서 말했듯이, 그것은 다른 것보다 스타일의 문제입니다. Java 세계에서는 (다른 것들 중에서도) 가독성을 위해 반대 (한 줄에 한 선언)가 권장됩니다.
— PhiLho

더 읽기 쉬운가? 사람들이 한 줄에 넣은 유일한 이유는 언급 한 JS 특정 이유입니다. JS는 모든 선언을 맨 위로 이동합니다. 그것이 그렇게하지 않으면, 우리는 그것들이 사용되는 지점에 가장 가까운 var를 선언 할 것입니다.
— Danyal Aytekin

@ vol7ron은 사실이 아니며 var진술 에 대한 오해입니다 . 정반대입니다. 문서 참조 및 예
— jackweirdy

@jackweirdy 당신이 맞으며 이전 브라우저의 경우, 구현이 잘못되었거나 버그였습니다. 그 이후로 내 댓글을 삭제했습니다.
— vol7ron

29

이런 식으로 할 때 훨씬 더 읽기 쉽습니다.

var hey = 23;
var hi = 3;
var howdy 4;

그러나 이런 식으로 공간과 코드 줄이 줄어 듭니다.

var hey=23,hi=3,howdy=4;

공간 절약에 이상적이지만 JavaScript 압축기가이를 처리하도록합니다.


15

아마도 이런 식으로

var variable1 = "hello world"
, variable2 = 2
, variable3 = "how are you doing"
, variable4 = 42;

첫 번째 또는 마지막 변수를 변경할 때를 제외하고 유지 관리 및 읽기가 쉽습니다.


6
일반적으로 쉼표를 사용하여 세미콜론은 해당 문제를 방지하기 위해 새로운 줄로 이동합니다. var variable1 = "hello world"\ n, variable2 = 2 \ n, variable3 = "어떻게
— 지내세요

2
하스켈 구문입니다. 나는 자바 스크립트에서 권장되지 않거나 일반적인 관행이 아니라고 생각한다
— shamanSK

14

개인적인 취향의 문제 일뿐입니다. 공백을 제거하면 두 번째 형식으로 저장된 몇 바이트 외에는이 두 가지 방법 사이에 차이가 없습니다.


두 번째는 몇 바이트를 절약합니다.
— Sophie Alpert

벤 알퍼트 : 어떻게 생각하십니까?
— Josh Stodola

공백을 제거하면 'var foo = "hello", bar = "world";' 선언은 'var foo = "hello"; var bar = "world";'보다 적은 문자를 사용합니다. 인기있는 사이트가 있다면 JS에 몇 바이트를 저장하면 도움이 될 수 있습니다 (변수 이름 등을 최소화하고 싶을 수도 있습니다)
— Brian Campbell

JavaScript 축소 기, 특히 Google Closer Compiler (소위) 단순 모드의 증가로 인해 현재 저장된 바이트 수가 관련이없는 것으로 보입니다.
— Bryan Field

1
@webnesto 구문의 의미가 동일한 경우 구문에서 성능이 전혀 없습니다. 코드를 즉시 실행하지는 않지만 먼저 구문 분석하고 의미 분석을 수행합니다. 여기에서 두 선언 스타일이 동일하게됩니다.
— Esailija

14

ECMAScript6 는 꽤 좋은 작동하는 구조 지정 할당 을 도입했습니다 .

[a, b] = [1, 2] a같을 것이다 1와 b동일 할 것이다 2.


그것은 질문에 대답하지 않지만 설명 된 두 가지 접근법에 대한 더 나은 대안이 될 수 있습니다.
— svarog

1
변수 목록이 길면 접근 방식을 실제로 사용할 수 없다고 생각합니다. 어떤 값이 관련되어 있는지 말하기 어렵고 오류로부터 보호되지 않는 것은 실수로 배열에서 하나의 요소를 제거 할 수있는 잘못된 병합의 경우입니다. 예 : let [aVar, bVar, cVar, xVar, yVar, zVar] = [10, 20, 30, 40, 50]; 개인적으로 권장하지 않습니다.
— Kirill Reznikov

1
그래도 같은 값으로 많은 변수를 설정하려는 경우 편리합니다. 예를 들어 루프에서 0으로 재설정하는 데 사용합니다.
— Nick

예! 이것이 내가 찾던 것입니다. 특히 배열이 아닌 2 차원 쌍 또는 다차원 값을 정의하려는 경우.
— 유진 Kardash

11
var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

다음보다 더 읽기 쉽습니다.

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;

그러나 그들은 같은 일을합니다.


적은 "파일 공간"을 사용합니까? 할 설명이 있다고 생각합니다.
— Josh Stodola

@JoshStodola는 나에게 동일한 파일 공간을 보입니다. 그보다 var<space>는<space><space><space><space>
— WORMSS

@WORMSS 그것의하지 않는 한 var<space>또는 var<tab>대 <tab>. 여전히 크게 ot.
— mpag

9

ES6 Destructuring assignment 사용 : 배열의 값 또는 객체의 속성을 별개의 변수로 압축 해제합니다.

let [variable1 , variable2, variable3] = 
["Hello World!", "Testing...", 42];

console.log(variable1); // Hello World!
console.log(variable2); // Testing...
console.log(variable3); // 42


4
특히 약 10 개의 변수를 할당 해야하는 경우 끔찍한 아이디어입니다.
— Kirill Reznikov

7

쉼표에 대한 나의 유일한 필수 사용법은 for 루프입니다.

for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}

나는 이것이 JavaScript에서 괜찮은지 찾아보기 위해 갔다.

그것이 작동하는 것을 보았을지라도, n이 함수의 로컬인지 여부에 대한 의문이 남았습니다.

이것은 n이 로컬인지 확인합니다.

a=[3,5,7,11];
(function l () { for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}}) ();
console.log(typeof n == "undefined" ?
  "as expected, n was local" : "oops, n was global");

잠시 동안 나는 언어 사이를 전환 확신하지 못했습니다.


7

둘 다 유효하지만 두 번째 방법을 사용하면 경험이 부족한 개발자는 var 문을 어디에나 배치하고 게양 문제를 일으키는 것을 권장하지 않습니다. 함수의 맨 위에 함수 당 하나의 var 만 있으면 코드 전체를 디버그하기가 더 쉽습니다. 이는 변수가 선언 된 행이 원하는대로 명시 적이 지 않음을 의미 할 수 있습니다.

트레이드 오프가 가치가 있다고 생각합니다. 개발자가 원하는 위치에 'var'을 떨어 뜨리는 것을 의미한다면 말입니다.

사람들은 JSLint에 대해 불평 할 수도 있지만, 많은 문제는 언어 문제를 해결하는 것이 아니라 코더의 나쁜 습관을 수정하고 코드의 문제를 예방하는 데 중점을 둡니다. 따라서:

"블록 범위가있는 언어의 경우 일반적으로 처음 사용하는 사이트에서 변수를 선언하는 것이 좋습니다. 그러나 JavaScript에는 블록 범위가 없으므로 함수 상단에 함수의 모든 변수를 선언하는 것이 더 현명합니다. 함수 당 하나의 var 문을 사용하는 것이 좋습니다. " -http: //www.jslint.com/lint.html#scope


6

개인 취향의 문제라고 생각합니다. 나는 다음과 같은 방법으로 그것을 선호합니다 :

   var /* Vars */
            me = this, that = scope,
            temp, tempUri, tempUrl,
            videoId = getQueryString()["id"],
            host = location.protocol + '//' + location.host,
            baseUrl = "localhost",
            str = "Visit W3Schools",
            n = str.search(/w3schools/i),
            x = 5,
            y = 6,
            z = x + y
   /* End Vars */;

6

단일 명령문 버전 (단일 var ) 을 피하는 또 다른 이유 는 디버깅입니다. 예외가 던져 경우 어떤 과제 라인 스택 트레이스 쇼 단지 한 줄의.

쉼표 구문으로 10 개의 변수를 정의한 경우 어느 변수가 범인인지 직접 알 수 없습니다.

개별 성명서 버전은 이러한 모호성을 겪지 않습니다.


2

"Cohesion over Coupling"개념은 객체 / 모듈 / 함수보다 더 일반적으로 적용될 수 있습니다. 이 상황에서도 사용할 수 있습니다.

OP가 제안한 두 번째 예는 모든 변수를 동일한 문에 결합했기 때문에 한 줄을 가져 와서 물건을 깰 필요없이 다른 곳으로 옮길 수 없습니다 (높은 결합). 그가 준 첫 번째 예는 변수 할당을 서로 독립적으로 만듭니다 (낮은 커플 링).

낮은 결합은 종종 체계적인 컴퓨터 시스템과 좋은 디자인의 징조이며, 높은 응집력과 결합 될 때 높은 가독성과 유지 보수성의 일반적인 목표를 지원합니다.”

http://en.wikipedia.org/wiki/Coupling_(computer_programming)

첫 번째를 선택하십시오.


1
이것이 커플 링 또는 응집력과 어떻게 관련되어 있는지 알 수 없습니다. 정교하게 관리?
— Edson Medina

OP가 제안한 두 번째 예는 모든 변수를 동일한 문에 결합했기 때문에 한 줄을 가져 와서 물건을 깰 필요없이 다른 곳으로 옮길 수 없습니다 (높은 결합). 그가 준 첫 번째 예는 변수 할당을 서로 독립적으로 만듭니다 (낮은 커플 링).
— Magne

커플 링은 코드 라인이 아닌 다른 모듈 / 객체 / 기능 간의 상호 의존성에 관한 것입니다!
— Edson Medina

1
원래는 모듈에 관한 것이지만 정의가 보여주는 객체 / 함수를 포함하여 개념을보다 일반적으로 적용 할 수 있습니다.
— Magne

2

낡은 게시물이지만 동료 Google 직원을 위해 약간의 관점을 추가해야합니다.

이와 같은 작은 형식으로 유지 관리 문제를 쉽게 극복 할 수 있습니다.

let
  my_var1 = 'foo',
  my_var2 = 'bar',
  my_var3 = 'baz'
;

개인 취향에 따라이 서식을 엄격하게 사용합니다. 물론 단일 선언이나 단순히 작품을 요약하는 경우이 형식을 건너 뜁니다.


1

ES6 사용을 시작하기 전에 단일 var 선언을 사용한 접근 방식이 좋거나 나쁘지 않다고 'use strict'생각합니다. :

  1. 이제 우리는 두 가지 새로운 종류의 변수를 var가지게되었습니다. const실제로 필요할 때까지 어디에서나 사용하는 것이 좋습니다 let. 따라서 코드 중간에 코드가 포함 된 변수 선언이 포함되는 경우가 많으며, 블록 범위 지정으로 인해 작은 변경이있을 경우 블록간에 변수를 이동하는 경우가 많습니다. 여러 줄로 선언하는 것이 더 편하다고 생각합니다.

  2. ES6 구문이 더욱 다양해졌으며, 소멸자, 템플릿 문자열, 화살표 기능 및 선택적 어설 션이 있습니다. 단일 var 선언으로 모든 기능을 많이 사용하면 가독성이 떨어집니다.


0

내 의견으로는 읽기가 어려운 첫 번째 방법 (여러 변수)이 가장 좋을 것이라고 생각합니다 (Knockout을 사용하는 응용 프로그램에서).

    var categories = ko.observableArray(),
        keywordFilter = ko.observableArray(),
        omniFilter = ko.observable('').extend({ throttle: 300 }),
        filteredCategories = ko.computed(function () {
            var underlyingArray = categories();
            return ko.utils.arrayFilter(underlyingArray, function (n) {
                return n.FilteredSportCount() > 0;
            });
        }),
        favoriteSports = ko.computed(function () {
            var sports = ko.observableArray();
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        sports.push(a);
                    }
                });
            });
            return sports;
        }),
        toggleFavorite = function (sport, userId) {
            var isFavorite = sport.IsFavorite();

            var url = setfavouritesurl;

            var data = {
                userId: userId,
                sportId: sport.Id(),
                isFavourite: !isFavorite
            };

            var callback = function () {
                sport.IsFavorite(!isFavorite);
            };

            jQuery.support.cors = true;
            jQuery.ajax({
                url: url,
                type: "GET",
                data: data,
                success: callback
            });
        },
        hasfavoriteSports = ko.computed(function () {
            var result = false;
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        result = true;
                    }
                });
            });
            return result;
        });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.