퀴즈
다음 코드의 출력 결과를 맞춰보세요.
function change(a, b, c){
a = 2;
b = { b: 'changed' };
c.c = 'changed';
};
let a = 1;
let b = { b: 'unchanged' };
let c = { c: 'unchagned' };
console.log(a, b, c);
기본 원리
- 함수 파라미터는 mutable하다.
- 함수 파라미터는 block scope를 지닌다. lexical environment의 environment record에 기록되고 관리되기 때문이다.
- 함수 호출시, creation phase에 함수 파라미터의 값이 초기화된다. primitive value 인자는 값을 복사하고, reference value 인자는 참조(메모리 주소)를 가진다.
해석
- a: primitive value이므로 전달시 값을 복사한다. a의 값을 변경했을 때 lexical environment의 environment record의 값이 변경되기 때문에 block scope만 값 변경의 영향을 받는다.
- b: reference value이므로 메모리 주소를 전달한다. b의 레퍼런스를 변경했을 때 lexical environment의 environment record의 값이 변경되기 때문에 block scope만 값 변경의 영향을 받는다.
- c: reference value이므로 메모리 주소를 전달한다. c의 내부 프로퍼티를 변경했을 때 객체 자체가 수정되는 것이기 때문에 block scope가 아닌 외부에서도 값 변경의 영향을 받는다.
따라서
a unchanged {b: 'unchanged'} {c: 'changed'}
가 출력된다.
요약
- 함수 파라미터는 lexical environment의 environment record에 초기화되므로 block scope를 지닌다. 또한 mutable하다.
- 함수 파라미터로 primitive value를 전달하면 복사본이 들어가고, refernce value를 전달하면 reference(메모리 참조값)이 들어간다.
- reference를 전달했을 때 내부 프로퍼티 값을 변경하면, 객체 자체의 값이 변경되어 동일한 객체를 가르키는 다른 스코프 식별자도 영향을 받는다.
Top comments (0)