자바 스크립트 루프 변수 범위
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 루프가있는 동일한 범위에 있습니다. 이 표현식의 결과는 삭제됩니다.
자바 스크립트가 될 때까지 블록 범위를하지 않았다 const
및 let
단지, 도입 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
'IT박스' 카테고리의 다른 글
git push fails :`refusing to update check out branch : refs / heads / master` (0) | 2020.12.27 |
---|---|
인앱 구매에서 가격 등급을 변경할 수 없습니다. (0) | 2020.12.27 |
OSX 10.11 El Capitan에 virtualenvwrapper를 설치할 수 없습니다. (0) | 2020.12.27 |
가상 상속 (0) | 2020.12.26 |
C / C ++로 DLL을 컴파일 한 다음 다른 프로그램에서 호출 (0) | 2020.12.26 |