inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

코어 자바스크립트

실행 컨텍스트 (execution context)

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

235

작성자 없음

작성한 질문수 0

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

javascript

답변 1

1

정재남

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

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

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

0

rlaxogud2111

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

0

정재남

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

인스턴스에서 prototype 프로퍼티에 직접 접근해야하는 이유

0

73

1

setTimeout 에서 this

0

95

1

2강부터 영상이 나오지 않습니다.

0

190

1

자바스크립트 주석에 이상한 점이 있어서 문의드립니다.

0

235

2

return 문 안에 여러 함수가 존재하는 것이 이해되지 않습니다.

1

274

1

클래스 static 멤버

1

256

1

실행컨텍스트와 스택프레임

2

574

1

프로토타입으로 상속할때 브릿지 사용 이유

0

328

1

호이스팅 관련 질문

1

342

1

책 66p. 예제 3-2 질문입니다.

0

360

1

강의 내용 10:58 캡슐화 질문입니다.

1

405

1

강의 내용 5:10 질문입니다.

1

425

2

전역 공간에서의 this

0

431

2

18:31 addEventListener의 this

1

488

1

outerEnvironmentReference 질문

1

376

1

실행 컨텍스트와 클로저에 대해 질문드립니다.

1

455

1

Object.prototype.constructor의 [[prototype]] ?

1

661

1

함수를 값으로 할당할 때

2

462

1

15:54 'ddd' 사라지는 오류?

4

382

1

프로토타입 getPrototypeOf(instance).constructor(n,a) 질문입니다.

1

410

1

기본형/가변형 질문입니당

0

337

0

선생님 그러면 섹션 0만 봐도 무방한가요!?

0

341

1

Hoisting과 environmentRecord에 관한 질문입니다.

1

295

1

안녕하세요, 데이터 변경 질문입니다.

0

335

1