[자바스크립트] call by value vs call by reference
자바스크립트

[자바스크립트] call by value vs call by reference

반응형
call by value vs call by reference




  • call by value

argument로 value(값)이 넘어온다.

이때, 넘어올 때는 '복사된 값'이 넘어온다.

caller(호출하는 자)가 인자를 복사해서 넘겨줬기 때문에 callee(호출된 자)에서 받은 인자를 아무리 수정하더라도 caller는 영향 받지 않음

예시
var a = 1;
var func = function(b) { // callee
b = b + 1;
}
func(a); // caller
console.log(a); // 1

기본적으로 자바스크립트는 원시값을 arguments로 넘겨주면 call by value로 작동

이처럼 caller가 1을 argument로 넘겨줘도 복사되어 넘어오기 때문에 callee가 어떤 연산을 하더라도 caller의 a 값은 변하지 않음

대신, 인자를 넘겨줄 때마다 메모리 공간을 할당하기 때문에 공간을 잡아먹는 단점 존재





  • call by reference

argument로 reference가 넘어온다.

(reference : 값에 대한 참조 주소, 메모리 주소를 담고있는 변수)

reference를 넘기다 보니 해당 reference가 가리키는 값을 복사하지는 않음

caller는 인자를 복사해서 넘긴 것이 아니라 참조 값을 넘겼기 때문에 callee가 받은 인자를 수정하면 caller도 영향을 받음

예시
var a = {};
var func = function(b) { // callee
b.a = 1;
}
func(a); // caller
console.log(a.a); // 1

메모리 공간 할당의 문제를 해결했지만, 원본 데이터 값을 훼손할 수 있음




중요 체크

하지만, 자바스크립트에서는 무조건 call by value로 작동하기 때문에 참조 타입으로 넘겨도 값이 변하지 않는다. 참조 타입을 인자로 넘기면 참조 값에 대한 복사본이 넘어가기 때문에 기존의 개념과는 다르기 때문에 알고있기 (call by sharing)

var a = {};
var func = function(b) {
b = (b.a=1);
b.b = 2;
}
func(a);
console.log(a);
  • 출력값 : {a: 1}

  • 이유 b = (b.a =1);로 b.a에 1이 할당되면서 매개변수로 전달된 a.a에는 1이 들어간다. 또한 b=1이기도 하다. 따라서 b는 객체가 아닌 원시값이 되어 a: 1로 출력이 된다.


반응형