강의

멘토링

커뮤니티

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

작성자 없음

작성자 정보가 삭제된 글입니다.

코어 자바스크립트

실행 컨텍스트 (execution context)

예시 코드 질문이 있습니다.

작성

·

231

1

안녕하세요!! 질문이 있습니다. 선언을 var로 했을때는 이해가 됐는데 만약에 선언을 let으로 하고 inner 함수 안에는 재선언이 불가능하므로 a = 3; 이렇게 했을 때 값 출력이 1 1 3 3 이 순서로 나오더군요 inner 함수안에서 a = 3 값을 선언했는데 어떻게 마지막 a 값이 1이 아닌 3이 찍히는 건지 궁금합니다!

let a = 1;
function outer(){
console.log(a); // 1 콘솔 출력 순위

function inner(){
console.log(a); // 2
a = 3;
}

inner();

console.log(a); // 3
}

outer();
console.log(a); // 4

답변 1

1

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

질문 내용상으로는 'var를 let으로 바꾸니 동작이 달라졌다'고 하신 것 같지만, 
실제로는 제시해주신 코드의 let을 var로 바꿔보셔도 결과는 똑같이 나옵니다.
즉 선언 형식이 let이든 var이든 무관한 내용입니다.

  • '함수 안에는 재선언이 불가능하므로' 라는게 어떤 말씀이신지 모르겠습니다.
  • 'inner 함수안에서 a = 3 값을 '선언' 한게 아니라, a라는 변수에 값 3을 '할당'했을 뿐입니다.
  • inner 함수에서 '선언'된 변수가 없으니, 스코프체인을 따라 선언된 변수 a를 찾아나가다가,
    전역공간에 선언된 변수 a에 할당하게 됩니다. 

let은 es6에서 도입된 것으로 본 강의는 다루지 않는 내용입니다.
var, let, const의 차이를 정확히 알고 싶으시면 ES6를 별도로 공부하시길 바랍니다.

제가 질문을 잘못 물어본 거 같습니다.
정리하자면 inner 함수안에서 a 값을 '재할당'을 했을 때 그게 전역공간에 있는 a값도 영향을 받는지가 궁금했습니다.

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

네. 앞서 말씀드린대로 inner 함수 내에는 선언한 변수가 없으니 찾아올라가서 전역변수에 할당하는 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기