• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

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

23.10.12 12:06 작성 조회수 165

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

질문자

2023.10.20

답변 감사합니다 !!! 🫡

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.14

안녕하세요, 인프런 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은 블록 스코프를 가지고 있기 때문에 변수의 유효 범위에 차이가 있습니다.

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