IT박스

자바 스크립트 루프 변수 범위

itboxs 2020. 12. 27. 10:28
반응형

자바 스크립트 루프 변수 범위


JavaScript 변수의 범위 지정에 대한 간단한 질문입니다.

alert()함수 i가 반환 하는 대신 값을 인쇄하는 이유는 무엇 undefined입니까?

$(document).ready(function () {
    for(var i = 0; i < 10; i += 1){
    }

     alert("What is 'i'? " + i);
});

나는 JS를 처음 접했고 내가 다룬 거의 모든 다른 언어에서 for 루프 범위의 선언에는 해당 루프에 대한 값이 포함되지만이 경우에는 그렇지 않습니다. 왜 그런가요?

What is 'i'? 10'인쇄됩니다.


루프 의 " 초기화 매개 변수 "에 대해서는 MDN을 참조하십시오 .for

식 (할당 식 포함) 또는 변수 선언. 일반적으로 카운터 변수를 초기화하는 데 사용됩니다. 이 표현식은 선택적으로 var 키워드를 사용하여 새 변수를 선언 할 수 있습니다. 이러한 변수는 루프에 국한되지 않습니다. 즉, for 루프가있는 동일한 범위에 있습니다. 이 표현식의 결과는 삭제됩니다.


자바 스크립트가 될 때까지 블록 범위를하지 않았다 constlet단지, 도입 var범위 기능이다. 의 초기화 i는 하나의 함수 내에 있으므로 해당 변수는 동일한 함수의 다른 곳에서 액세스 할 수 있습니다.

에서 MDN :

중요 : JavaScript에는 블록 범위가 없습니다. 블록과 함께 도입 된 변수는 포함하는 함수 또는 스크립트로 범위가 지정되며 설정의 효과는 블록 자체를 넘어서 지속됩니다. 즉, 블록 문은 범위를 도입하지 않습니다. "독립 실행 형"블록은 유효한 구문이지만 JavaScript에서 독립 실행 형 블록을 사용하고 싶지 않습니다. C 또는 Java에서 이러한 블록과 같은 작업을 수행한다고 생각하면 사용자가 생각하는 작업을 수행하지 않기 때문입니다.


자바 스크립트 사람들이이 문제를 해결하려고합니다!

EcmaScript6 (일명 EcmaScript 2015)는 지난 여름에 통과 된 최신 버전의 자바 스크립트이며 브라우저는 이제 막 기능을 지원하기 시작했습니다.

이러한 기능 중 하나는 "let"표현식이있는 블록 범위 지역 변수입니다. 현재 (2016 년 4 월) 현재 대부분의 주요 브라우저 버전은 Safari를 제외하고이를 지원합니다. 이를 지원하는 모바일 브라우저는 거의 없습니다.

여기에서 자세한 내용을 읽을 수 있습니다 (특히 "for 루프의 let 범위 변수"섹션 참조) : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

여기에서 현재 브라우저 지원을 확인할 수 있습니다 (Bindings-> let 행 찾기) : https://kangax.github.io/compat-table/es6/


다른 언어 (예 : Java, C ++, C)와 달리 JavaScript는 블록 범위를 지원하지 않습니다. 루프 또는 함수에서 변수를 선언하면 범위는 함수 본문 내에 있습니다.

for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

여기서 당신 i은 전역 변수 j가되고 루프가있는 함수 나 스크립트에 로컬이됩니다.


for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

위의 내용이 전역 변수를 생성한다고 말하는 것은 올바르지 않습니다 i. 나는 항상 var변수를 선언 하는 사용해야한다고 생각합니다 ( '변수'가 아닌 '속성'을 의도적으로 원하지 않는 한-JS 코딩 시나리오의 99.99 %에서는 거의 발생하지 않습니다 ...)

var초기 값을 할당 할 때 생략 하면 i로컬 또는 전역 변수가 생성되지 i않고 전역 개체에 대한 속성이 생성됩니다 (대부분 전역 변수처럼 보이거나 동작 할 수 있지만 약간의 차이가 있습니다).

더 나은 것 :

var i;
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

이제 루프는 전역 변수 i(또는 i이 코드가 함수에 나타나면 함수 지역 변수 )를 사용하고 있습니다.

var 키워드변수 의 기능Javascript의 속성에서 이에 대해 자세히 알아보십시오.

-약간 혼란스러운 점은 예를 들어 두 번째 루프에서 변수를 다시 선언 할 수 있다는 것입니다.

for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}


for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}

이것은 유효한 것 같습니다 (테스트 할 때 오류 없음). 자바 스크립트에서 변수를 다시 선언 할 수있는 것 같습니다.하지만 특별한 경우가 아니면 모든 것이 좋은 생각은 아닙니다. [Google Analytics가 변수의 '안전한'재 선언을 사용하는 방법을 언급하는이 관련 질문을 참조하십시오.] ( 자바 스크립트 변수 재 선언 )

there is some discussion about re-declaring variables in JS (and also loop variables like i) in this related SO question: declare variables inside or outside the loop

There is event a JavaScript pattern for single declaration of variables

ReferenceURL : https://stackoverflow.com/questions/18465211/javascript-loop-variable-scope

반응형