[javascript] JavaScript의 “for-in”루프에 “var”또는 “var”없음?

for-inJavaScript 에서 루프 를 작성하는 올바른 방법은 무엇입니까 ? 브라우저는 내가 여기에서 보여주는 두 가지 접근 방식 중 하나에 대해 불만을 제기하지 않습니다. 첫째, 반복 변수 x가 명시 적으로 선언 되는 다음 접근 방식이 있습니다 .

for (var x in set) {
    ...
}

그리고 대안으로 더 자연스럽게 읽지 만 나에게 맞지 않는이 접근 방식 :

for (x in set) {
    ...
}



답변

를 사용 var하면 변수의 범위가 줄어 듭니다. 그렇지 않으면 변수가 var문을 검색하는 가장 가까운 클로저를 찾습니다 . 를 찾을 수 없으면 var전역입니다 (엄격 모드에있는 using strict경우 전역 변수에서 오류가 발생 함). 이로 인해 다음과 같은 문제가 발생할 수 있습니다.

function f (){
    for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2

당신이 작성하는 경우 var i루프에 대한 경고 쇼에 2.

자바 스크립트 범위 지정 및 호이 스팅


답변

첫 번째 버전 :

for (var x in set) {
    ...
}

라는 지역 변수를 선언합니다 x. 두 번째 버전 :

for (x in set) {
    ...
}

하지 않습니다.

경우 x(당신이 가지고 즉, 이미 지역 변수 var x;또는 var x = ...;어딘가에 이전 현재 범위 (즉, 현재 함수)) 그들은 동등 할 것이다. x가 아직 지역 변수가 아닌 경우 두 번째를 사용하면 암시 적으로 전역 변수를 선언합니다 x. 이 코드를 고려하십시오.

var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
    for (x in obj1) alert(x);
}
function loop2() {
    for (x in obj2) {
        loop1();
        alert(x);
    }
}
loop2();

당신이 경고에이를 기대할 수 hey, there, heli, hey, there, copter,하지만 이후 x하나가 알려드립니다 동일 hey, there, there, hey, there, there. 당신은 그것을 원하지 않습니다! 루프 var x에서 사용하십시오 for.

무엇보다도 for루프가 전역 범위 (즉, 함수가 아님)에있는 경우 로컬 범위 ( x를 사용하는 경우 범위 가 선언 됨 var x)는 전역 범위와 동일합니다 (범위 x는에서 암시 적으로 선언 됨). xvar없이 사용 하는 경우 ) 두 버전이 동일합니다.


답변

항상var ,로 지역 변수를 선언해야합니다 .

당신이하고 싶은 일이 확실하지 않다면 “for … in”루프를 사용해서는 안됩니다. 실제 배열 (매우 일반적 임)을 반복하려면 항상 숫자 인덱스가있는 루프를 사용해야합니다.

for (var i = 0; i < array.length; ++i) {
  var element = array[i];
  // ...
}

“for … in”을 사용하여 일반 배열을 반복하면 루프가 숫자 인덱스 외에 배열의 속성을 선택할 수 있으므로 예기치 않은 결과가 발생할 수 있습니다.

편집 — 2015 년 .forEach()에는 배열을 반복하는 데 사용 하는 것도 좋습니다 .

array.forEach(function(arrayElement, index, array) {
  // first parameter is an element of the array
  // second parameter is the index of the element in the array
  // third parameter is the array itself
  ...
});

.forEach()메서드는 IE9부터 Array 프로토 타입에 있습니다.


답변

실제로 for제목 내 선언이 마음에 들지 않으면 다음을 수행 할 수 있습니다.

var x;
for (x in set) {
    ...
}

이 질문에 대한 다른 답변에서 언급했듯이 전혀 사용하지 않으면 var전역 속성 할당과 같은 불필요한 부작용이 발생합니다.


답변

로 루프 변수를 선언하는 곳을 사용하십시오 var. 암시 적으로 선언 된 변수에는 의도 한 것과 다른 범위가 있습니다.


답변

for(var i = 0; ...)

일반적으로 보이는 패턴이지만

for(int i; ...)

변수가 for블록으로 범위가 지정되지 않는다는 점에서 C ++에서 . 실제로 루프가 시작 되기 전 (현재 스코프 / 기능이 시작된 후)과 그 후에 var로컬 i이 효과적으로 사용 가능 하도록 둘러싸는 스코프 (함수)의 맨 위로 올라갑니다 for.

즉, 다음을 수행합니다.

(function(){ //beginning of your current scope;
 //...
 for(var i in obj) { ... };
})();

와 같다:

(function(){ //beginning of your current scope;
 var i;
 //...
 for(i in obj) { ... };
})();

ES6에는 범위를 for 블록으로 제한 하는 let키워드 (대신 var)가 있습니다.

물론 암시 적 전역 변수보다는 지역 변수 ( var또는 let또는 const(ES6에서)로 선언 된 변수)를 사용해야 합니다.

for(i=0; ...)또는 (필요한대로) 사용하고 선언 for(i in ...)하지 않으면 실패합니다 ."use strict";i


답변

사용하는 var것이 가장 깨끗한 방법이지만 둘 다 https://developer.mozilla.org/en/JavaScript/Reference/Statements/for…in에 설명 된대로 작동합니다.

기본적으로를 사용 var하면 새 변수를 만들 수 있습니다. 그렇지 않으면 이전에 정의한 변수를 실수로 사용할 수 있습니다.