평가전략이란?
프로그래밍 언어에서 함수 호출의 argument의 순서를 언제 결정하고 함수에 어떤 종류의 값을 통과 시킬지 결정하는 것
parameter 와 argument의 차이
그동안 parameter와 argument를 명확히 구분하지 않고 혼용하여 사용했는데 둘의 차이는 아래 예시 코드의 주석을 통해 확인할 수 있다.
parameter는 함수 선언부에 정의 되고, arguments는 함수 호출부에서 사용된다.
let arg = 1;
let myFunc = function(param) { // parameter (매개변수)
//...
};
myFunc(arg); // arguments (인자)
Call by Value - imutable
arguments로 값이 넘어올 때 복사된 값이 넘어온다.
caller가 인자를 복사해서 넘겨줬으므로 callee가 인자를 수정해도 caller는 영향을 받지 않는다.
자바스크립트는 기본적으로 원시값을 arguments로 넘겨주면 call by value의 형태로 작동한다.
let arg = 1;
let myFunc = function(param) { // callee
param = param + 1;
}
myFunc(arg); // caller
console.log(arg); // 1
Call by Reference - mutable
arguments로 참조값(메모리 주소)이 넘어올 때는 참조값을 복사하지 않는다.
복사한 값을 넘긴게 아니라 참조하고 있는 메모리 주소를 넘겼기 때문에 같은 값을 바라보게 되고 callee가 해당 인자를 수정하면 caller가 영향을 받는다.
자바스크립트는 기본적으로 참조값을 arguments로 넘겨주면 call by reference의 형태로 작동한다.
간단한 프로젝트에서 함수의 동작을 완벽히 이해하고 있다면 문제 될 것은 없지만 다수의 개발자들이 협업하고 규모가 큰 프로젝트가 될수록 쉽지 않은 일이기 때문에 ES-Lint에는 parameter 수정을 제한하는 규칙이 있다.
let arg = {};
let myFunc = function(param) { // callee
param.value = 1;
}
func(arg); // caller
console.log(arg.value); // 1
Call by Sharing
call by value의 특징과 call by reference의 특징을 둘 다 가진 평가전략이다.
arguments로 참조값을 넘긴 후 참조값을 수정하였음에도 값이 변하지 않는다.
arguments로 넘어온 참조값 (메모리 주소) 에 담긴 값을 수정할 수는 있지만 새로운 메모리 값으로 할당은 불가능하다.
즉, 동적 프로퍼티 할당을 시도하는 경우 위의 call by reference 처럼 실제 객체의 프로퍼티 값도 바뀌지만 재할당을 시도하면 우변의 값은 새로운 메모리에 올라가게 되고 좌변의 변수는 그 주소값을 가리키게 된다.
자바스크립트 외에도 Java, Ruby, Pyhton 등 언어의 펑가전략으로 사용된다.
let arg = {};
let myFunc = function(param) { // callee
param = 1;
}
func(arg); // caller
console.log(arg); // {}
'Development > JavaScript' 카테고리의 다른 글
자바스크립트로 옵저빙(변수 변화 탐지)를 구현하는 방법들 (0) | 2022.09.22 |
---|---|
이벤트 플로우 (이벤트 캡처링, 이벤트 버블링, 이벤트 위임) (0) | 2022.09.17 |
자바스크립트의 이벤트 루프 (2) | 2022.02.19 |
자바스크립트의 메모리 누수 (Memory Leaks) (0) | 2022.02.08 |
Promise (0) | 2021.10.07 |
댓글