1. 매개변수(파라미터) 재할당을 지양해야 한다고?
- 우리는 함수에 인수를 전달하고, 전달한 매개변수값을 재할당할 수 있다.
function test(value) { // value 매개변수
value = 13; // 매개변수 재할당
return value;
}
test(30); // 인수 전달
🤔 하지만, 매개변수 재할당은 eslint 규칙(no-param-reassign)으로 존재할만큼 지양해야하는 방법인데 왜 그런걸까? 그 이유를 알아보자!
2. 재할당의 위험성
(1) 인수와 파리미터가 달라 의도와 다른 동작이 발생한다.
- 파라미터는 인수를 참조하는 구조이다.
- 참조한다는 건, 파라미터가 인수의 주소를 가리킨다는 말인데 만약 파라미터의 값을 변경하면 어떻게 될까?
- 우리는
sum()
에 12, 13을 인자로 넘겼다. - 의도대로라면 25가 리턴되어야 하는데, 실제로는 113이 리턴되었다;
function sum(v1, v2) {
v1 = 100;
return v1 + v2;
}
sum(12, 13); // 113
왜 25가 아닌 113이 리턴되었을까?
- 함수 내부에서 파라미터를 변경하는 로직이 있어, 인수와 파리미터값이 달라지고 의도와 다른 결과값이 출력된 것이다ㅜ
(2) 파리미터 변경을 인지하지 못한다.
- 그럼, array 타입인 파리미터값을 변경하면 어떻게 될까?
- 파리미터값을 변경하기 전 후 인수와 파리미터를 비교해보았다.
- 비교 결과, 재할당 후에도 인수와 파라미터가 같다는 결과가 나온다!
function test(v) {
console.log(arr === v); // true
v[1] = 100;
console.log(arr === v); // true
}
const arr = [22, 15];
test(arr);
파리미터 값을 변경했는데, 왜 인수와 파리미터가 같은걸까?
- 그 이유는 바로, 배열에서 인덱스로 값 변경시 배열의 주소값은 바뀌지 않기 때문이다.
- 이 경우, 파라미터와 인수값이 실제로는 다르지만 주소값상 같아 동일한 배열로 인식되는 현상이 발생한다ㅜ
🚫 이처럼 함수에서 매개변수 재할당을 사용하면 인수와 매개변수 값의 차이가 발생하거나, 주소값이 동일하여 변경점을 인지하지 못한다. 이는 연산과정에서 의도치 못한 오류를 발생시킬 수 있으므로 지양하는 게 좋다!
반응형
'개발 기술 > 사소하지만 놓치기 쉬운 개발 지식' 카테고리의 다른 글
Array에서 NaN, undefined, null 제거하기 (0) | 2022.01.21 |
---|---|
[css] background: none vs transparent의 차이 (0) | 2022.01.06 |
[JS] 최대 스크롤값 구하는 법(scrollTop, scrollLeft) (1) | 2021.12.13 |
[CSS] max-width, 줄바꿈 같이 쓰는 법 (0) | 2021.12.12 |
[css] 한 줄, 여러 줄 말줄임 (0) | 2021.12.01 |
댓글