자바스크립트의 함수를 호출하면서 매개변수 원시 타입 값은 값을 전달 받고, 객체는 주소를 전달 받는다.
객체는 주소를 전달 받기 때문에 함수 body에서 객체를 변경 하였을 경우 원본이 훼손된다.
var changeVal = function(primitive, obj) {
primitive += 100;
obj.name = "kang";
}
var num = 50;
var obj = {
name: "lee"
};
changeVal(num, obj);
console.log(num); //50
console.log(obj.name); //kang
num은 원시타입으로 값을 그대로 전달 받았지만, obj는 객체이기 때문에 주소가 전달 되었고, 함수 body에서 name을 변경 하였더니 원본 자체도 name이 lee 에서 kang으로 변경 되었다.
위 문제에서 원본을 변경하지 않는 함수를 순수 함수라 하고 원본을 변경 하는 함수를 비순수 함수라 한다.
[비순수 함수]
var cnt = 0;
function increase() {
cnt = cnt + 1;
return cnt;
}
increase();
console.log(cnt); //1
비순수 함수는 원본 데이터를 변경한다. increase함수안에서 매개변수 없이 cnt 를 + 1 하여 원본 cnt가 어떤 값인지에 의존되고 원본 cnt 의 값을 바꾼다.
[순수 함수]
var cnt = 0;
function increase(cnt) {
cnt = cnt + 1;
return cnt;
}
console.log(increase(cnt)); //1
console.log(cnt); //0
순수 함수는 원본 데이터를 변경하지 않는다. 단순히 매개변수 cnt만 넣어도 원시 값이기 때문에 값을 그대로 전달 받았다. 하지만 문제점은 객체를 전달받으면 주소를 그대로 전달받기 때문에 원본 데이터를 변경 할 수 있다 그래서 원본 객체를 완전히 복제, 즉 깊은 복사 딥카피(deep cody)를 통해 새로운 객체를 생성해서 원본 데이터를 유지할 수 있다.
'Web > JavaScript' 카테고리의 다른 글
[Javascript] Kendo UI 로컬스토리지 적용 방법 (0) | 2024.01.26 |
---|---|
[JS] 자바스크립트 변수와 함수 호이스팅(hoisting)의 차이점 (0) | 2023.07.20 |
[JS] 자바스크립트 변수 호이스팅(hoisting) 쉽게 이해하기 (0) | 2023.07.18 |
[JS] 자바스크립트 변수 선언과 각 값 들의 타입 (0) | 2023.07.14 |
[JS] 자바스크립트 기본 타입 특징, 객체 특징과 사용 방법 (0) | 2023.07.11 |