인프런 커뮤니티 질문&답변

rhkdtjd_12님의 프로필 이미지
rhkdtjd_12

작성한 질문수

Javascript ES6+ 제대로 알아보기 - 초급

let

제가 이해한 부분이 혹시 맞는지 알 수 있을까요?

해결된 질문

작성

·

212

0

var로 생성 했을때 block스코프 생성 되지 않음

var funcs = [];
for (var i = 0; i < 10; i++) {
  funcs.push(function () {
    console.log(i);
  });
}
funcs.forEach(function (f) {
  f();
});

 

let으로 생성 했을 때 block스코프인해 변수의 유효범위가 생김.

즉, for문의 { } 블록 스코프로 변수의 유효범위로 인해서
funcs.push(function(){
console.log(i)
})
에서 i가 for문의 i를 가져올 수 있게 됨.

let funcs = [];
for (let i = 0; i < 10; i++) {
  funcs.push(function () {
    console.log(i);
  });
}
funcs.forEach(function (f) {
  f();
});

 

마찬가지로 var를 사용시 똑같은 코드지만 var는 블록스코프로 인해 유효범위가 없기 때문에 for문의 i의 변수의 유효범위로 console.log(i)에 영향을 가지지 못함.

 

 

답변 2

0

정재남님의 프로필 이미지
정재남
지식공유자

네 맞습니다 :)

rhkdtjd_12님의 프로필 이미지
rhkdtjd_12
질문자

답변 감사합니다 !!! 🫡

0

안녕하세요, 인프런 AI 인턴이에요.

제가 이해한 내용을 설명해 드리겠습니다.

첫번째 경우에는 var로 변수 i를 선언했기 때문에, for문이 실행될 때마다 i가 업데이트되면서 배열 funcs에 담긴 익명 함수들은 모두 같은 i를 참조하게 됩니다. 따라서 funcs를 호출할 때는 for문이 종료된 후의 i값을 출력하게 되어 10이 10번 출력되게 됩니다.

두번째 경우에는 let으로 변수 i를 선언했기 때문에, for문이 실행될 때마다 새로운 i가 생성되면서 배열 funcs에 담긴 익명 함수들은 각자 다른 i를 참조하게 됩니다. 따라서 funcs를 호출할 때는 for문에서의 각각의 i값을 출력하게 되므로 0부터 9까지 순서대로 출력됩니다.

var는 함수 스코프를 가지고 있는 반면, let은 블록 스코프를 가지고 있기 때문에 변수의 유효 범위에 차이가 있습니다.

더 궁금한 점이 있으시면 언제든지 물어보세요. 즐거운 프로그래밍 하세요!

rhkdtjd_12님의 프로필 이미지
rhkdtjd_12

작성한 질문수

질문하기