[javascript] var 키워드의 목적은 무엇이며 언제 사용해야합니까 (또는 생략해야합니까)?

참고 :이 질문은 ECMAScript 버전 3 또는 5의 관점에서 질문되었습니다. ECMAScript 6 릴리스에 새로운 기능이 도입되어 답변이 오래 될 수 있습니다.

varJavaScript 에서 키워드 의 기능은 정확히 무엇이며 차이점은 무엇입니까?

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

언제 하나를 사용하고 왜 / 무엇을합니까?



답변

글로벌 범위에 있다면 큰 차이가 없습니다. 설명을 위해 Kangax의 답변을 읽으십시오

함수에있는 경우 var로컬 변수를 만들면 “no var”는 변수를 찾거나 전역 범위에 도달 할 때까지 범위 체인을 조회합니다 (이 시점에서 변수가 생성됨).

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

과제를 수행하지 않는 경우 다음을 사용해야합니다 var.

var x; // Declare x


답변

차이가 있습니다.

var x = 1 x현재 범위에서 변수선언합니다 (일명 실행 컨텍스트). 선언이 함수에 나타나면 지역 변수가 선언됩니다. 전역 범위에 있으면 전역 변수가 선언됩니다.

x = 1반면에 속성 할당에 불과합니다. 먼저 x범위 체인에 대해 해결하려고 시도합니다 . 해당 범위 체인의 어느 곳에서나 발견되면 할당을 수행합니다. 그것을 찾을 수없는 경우 x에만 다음 수행 이 생성 x전역 객체에 속성을 (범위 체인의 최상위 개체입니다).

이제 전역 변수를 선언하지 않고 전역 속성을 만듭니다.

둘 사이의 차이는 미묘하고 당신이 이해하지 혼동 될 수있는 변수 선언은 또한 속성 생성 (만 변수 객체에를) 자바 스크립트 (물론, ECMAScript를)의 모든 속성은 특정 속성을 설명하는 플래그가 그 – 읽기 전용, DontEnum 및 삭제하지 마십시오.

변수 선언이 DontDelete 플래그 차이와 속성을 생성하기 때문에 var x = 1그리고 x = 1(전역에서 실행되는 경우에) 이전의 하나이다 – 변수 선언 – DontDelete’able 속성을 생성하고, 후자는하지 않는다. 결과적으로이 암시 적 할당을 통해 생성 된 속성은 전역 객체에서 삭제 될 수 있으며 이전 속성 (변수 선언을 통해 생성 된 속성)은 삭제할 수 없습니다.

그러나 이것은 물론 이론 일 뿐이며 실제로 구현의 다양한 버그 (IE의 버그)로 인해 둘 사이에 더 많은 차이점이 있습니다.

모든 것이 이해되기를 바랍니다. 🙂


[2010/12/16 업데이트]

ES5 (ECMAScript 5; 최근 표준화 된 5 번째 언어 버전)에는 소위 “엄격 모드”(선택 언어 모드)가 있으며 선언되지 않은 할당의 동작을 약간 변경합니다. 엄격 모드에서 선언되지 않은 식별자에 대한 지정은 ReferenceError 입니다. 이에 대한 이론적 근거는 우발적 인 할당을 포착하여 원하지 않는 글로벌 속성의 생성을 방지하는 것이 었습니다. 최신 브라우저 중 일부는 이미 엄격 모드 지원을 시작했습니다. 예를 들어 내 compat 테이블 을 참조하십시오 .


답변

로컬글로벌 ” 의 차이점 이 완전히 정확하지 않다고 말하면됩니다.

local가장 가까운 ” 의 차이점으로 생각하는 것이 좋습니다 . 가장 가까운 것이 반드시 전역일 수는 있지만 항상 그런 것은 아닙니다.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}


답변

Javascript가 브라우저에서 실행될 때 모든 코드는 다음과 같이 with 문으로 둘러싸입니다.

with (window) {
    //Your code
}

자세한 정보 with-MDN

이후 var변수 선언 전류 범위를 선언간에 차이가없는 var 윈도우 내부에 일체로 선언되지는.

차이점은 창 내부에 있지 않은 경우 (예 : 함수 내부 또는 블록 내부)에 발생합니다.

사용 var하면 이름이 같은 외부 변수를 숨길 수 있습니다. 이런 식으로 “비공개”변수를 시뮬레이션 할 수 있지만 이는 또 다른 주제입니다.

경험상 var미묘한 버그가 발생할 위험이 있기 때문에 항상를 사용하는 것이 좋습니다 .

편집 : 내가받은 비평 후에 다음을 강조하고 싶습니다.

  • var현재 범위에서 변수 선언
  • 글로벌 범위는 window
  • 전역 범위 (창)에서 var암시 적으로 선언 var을 사용하지 않음
  • 전역 범위 (창)에서 변수를 사용하여 선언하는 var것은 생략하는 것과 같습니다.
  • 창과 다른 범위에서 변수를 선언하는 var 것은 변수를 선언하지 않고 선언하는 것과 다릅니다var
  • var좋은 습관이기 때문에 항상 명시 적으로 선언하십시오

답변

var변수를 선언 하려면 항상 키워드를 사용하십시오 . 왜? 좋은 코딩 관행은 그 자체로 충분한 이유가되지만, 생략하면 전역 범위 에서 선언된다는 것을 의미합니다 (이와 같은 변수를 “암시 적”전역이라고 함). Douglas Crockford 는 암시 적 글로벌을 사용하지 말고 Apple JavaScript 코딩 지침 에 따라 다음을 권장합니다 .

var
키워드 없이 생성 된 모든 변수 는 전역 범위에서 생성되며 함수가 범위를 벗어나지 않기 때문에 함수가 반환 될 때 가비지 수집되지 않으므로 메모리 누수가 발생할 수 있습니다.


답변

다음은 지역 변수를 선언하지 않는 방법에 대한 좋은 예입니다 var.

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

( i루프에서 로컬로 선언되지 for않고 글로벌 로 선언되므로 루프의 모든 반복에서 재설정 됨 ) 결국 무한 루프가 발생합니다.


답변

var대부분의 상황에서 사용하는 것이 좋습니다 .

지역 변수는 항상 전역 범위의 변수보다 빠릅니다.

var변수를 선언하는 데 사용하지 않으면 변수가 전역 범위에있게됩니다.

자세한 내용을 보려면 Google에서 “scope chain JavaScript”를 검색하십시오.