for-in
JavaScript 에서 루프 를 작성하는 올바른 방법은 무엇입니까 ? 브라우저는 내가 여기에서 보여주는 두 가지 접근 방식 중 하나에 대해 불만을 제기하지 않습니다. 첫째, 반복 변수 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
는에서 암시 적으로 선언 됨). x
var없이 사용 하는 경우 ) 두 버전이 동일합니다.
답변
항상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
하면 새 변수를 만들 수 있습니다. 그렇지 않으면 이전에 정의한 변수를 실수로 사용할 수 있습니다.