728x90
반응형
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}
이유
728x90
반응형
'자바스크립트' 카테고리의 다른 글
[자바스크립트] 4. 프로토타입 & 배열 (0) | 2018.10.13 |
---|---|
[자바스크립트] 3. 객체 (0) | 2018.10.13 |
[자바스크립트] 2. 데이터 타입 (0) | 2018.10.13 |
[자바스크립트] 1. 소개 (0) | 2018.10.13 |
[자바스크립트] ES2015+ 요약 정리 (0) | 2018.09.19 |