Dog foot print

[javascript] Call By Reference , Call By Value 본문

Javascript

[javascript] Call By Reference , Call By Value

개 발자국 2019. 7. 17. 22:45

c언어나 c++같은 언어를 배우는 사람들은 swap(int a, int b) 같은 함수를 만들때 인자로 그냥 일반자료형이 아니라 포인터라는 것을 넘겨주어야 우리가 원하는 결과가 나오는 것을 알것이다. 그러나 다행스럽게도(?) 자바스크립트에서는 포인터가 없다. 이 포인터라는 것이 없기 때문에 javascript에서는 함수의 인자로 기본자료형(string, numb, undefined,bullean,null)이 들어 왔을때 값을 복사한 변수를 새로 메모리에 만들게 된다. 그로인하여 함수의 결과는 새로운 메모리의 값을 변경하는 행위가 되고 실제 인자로 들어온 변수들의 메모리의 값을 변경하는 행위는 하지 못한다.  

 

예제

let a = 10;
let b = 20;

function swap(x,y){
    let temp = x;
    x = y;
    y = x; //이 함수내부에서 console.log()를 찍어보면 값은 바뀌어 있지만 이 함수내부에서만 유효하다. 
}

swap(a,b);
console.log(a,b); //결과는 여전히 10과 20이 출력된다.

 

다만 전역변수를 이용하여 값을 변환시키는 행위는 가능하다. 

 

let a = 10;
let b = 20;

function callByReference(){
    let temp = a;
    a = b;
    b = temp;
}

callByReference();
console.log(a,b); //결과는 20 , 10 이 출력된다. 

 

Call By Reference 메모리 영역에 의한 참조

기본자료형 이외에 배열이나 객체를 전달하면 해당 객체의 프로퍼티나 배열의 item을 변경, 추가 할 수 있다. 

 

let obj = {
    property : 100
}

function change(obj){
    obj.property = 200;
}

change(obj);
console.log(obj); //결과는 200

function push(array){
    array.push(3);
}

let array = [1,2];

push(array);
console.log(array); //결과는 1,2,3

 

다만 인자로 들어온 객체나 배열을 재할당하여 다른 기본 자료형으로 만들려고 할때는 call by value가 되어 해당 함수 내부에서만 유효하다. 

 

let obj = {
    property : 100
}

function change(obj){
    obj = "obj";
}

change(obj);
console.log(obj); //결과는 200

function push(array){
    array = "array";    
}

let array = [1,2];

push(array);
console.log(array); //결과는 1,2,3
반응형
Comments