[javascript] var 키워드의 목적은 무엇이며 언제 사용해야합니까 (또는 생략해야합니까)?
참고 :이 질문은 ECMAScript 버전 3 또는 5의 관점에서 질문되었습니다. ECMAScript 6 릴리스에 새로운 기능이 도입되어 답변이 오래 될 수 있습니다.
var
JavaScript 에서 키워드 의 기능은 정확히 무엇이며 차이점은 무엇입니까?
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”를 검색하십시오.