DEV Community

Chan
Chan

Posted on

javascript의 함수 파라미터 퀴즈(call by value and call by reference)

퀴즈

다음 코드의 출력 결과를 맞춰보세요.

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);
Enter fullscreen mode Exit fullscreen mode

기본 원리

  1. 함수 파라미터는 mutable하다.
  2. 함수 파라미터는 block scope를 지닌다. lexical environment의 environment record에 기록되고 관리되기 때문이다.
  3. 함수 호출시, 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'}
Enter fullscreen mode Exit fullscreen mode

가 출력된다.

요약

  1. 함수 파라미터는 lexical environment의 environment record에 초기화되므로 block scope를 지닌다. 또한 mutable하다.
  2. 함수 파라미터로 primitive value를 전달하면 복사본이 들어가고, refernce value를 전달하면 reference(메모리 참조값)이 들어간다.
  3. reference를 전달했을 때 내부 프로퍼티 값을 변경하면, 객체 자체의 값이 변경되어 동일한 객체를 가르키는 다른 스코프 식별자도 영향을 받는다.

Top comments (0)