var temp = {

// do  attribute

}


temp라는  데이터 모델?(객체) 를 통해서 값을 채우고 해당값을 


var resultArr = []; 에


resultArr.push(temp);


식으로 사용하다가 객체 참조 오류가 나는 경우가 생겼습니다.


temp를 수정후 


resultArr.push(temp) 시에는


resultArr [0] = >temp를 가지고있습니다.


다시한번 push 할 경우


resultArr[1] = > temp 0과 1둘다 temp와 같은 곳을 바라보게 됩니다.


수정하면서 push 는 되지만


결국 마지막 수정된 push 값을 resultArr은 전부 가지고있게 되는 것입니다.


예시를 들어 보겠습니다.


해당 예시는 객체 참조 에 대한 예시일뿐입니다.

	

	var temp = {
			"name":"",
			"age":""
	};


	var resultArr = [];

	var response = [
		{"name":"AAA","age":"aa"},
		{"name":"BBB","age":"bb"},
		{"name":"CCC","age":"cc"},
	];



	for(var i=0;i<3;i++)
	{
			temp.name = response[i].name;
			temp.age = response[i].age
			resultArr.push(temp);
	}



해당 결과는?




마지막에 수정되었던 CCC cc값을 전부 가지고있습니다. 모든 배열들이 새로 추가될때마다 같은 temp를 바라보게 되는 상황이 있기 때문입니다.

** push 하는 순간에 (shallow copy (얕은복사) 가 일어나기 때문에 발생하는 현상입니다.)


// 해당 상황에 대한 해결법은

Array.prototype.slice.call 

Array.prototype.slice.apply 

Object.assign 등이 있지만 객체 참조에 대한 이야기로 계속 진행하겠습니다.





gdl blah 가 있습니다. 들어온 숫자만큼 블라 블라를 외치네요


objRef 라는 새로운 객체를 생성 후 속성으로 gdl blah 를 가지게 되면


위의 그림과 같이 같은 함수를 바라보게 됩니다.


아마 해당상태에서는 함수의 동작은 블라를 외치기만 하기 때문에 큰 문제가되어 보이지는 않습니다.





objRef는 그대로 놓은 상태로 gdl의 블라를 제거한다면 위의 그림과 같이


function 은 gdl의 blah 를 바라보고있었지만 해당 연결고리가 끊어지는 바람에  objRef는 바라볼곳이 없어지며 에러를 발생 시킵니다.


해당 객체 참조 이슈가 나타나게 되는데


함수를 작성할 때 함수 Context 를 지정하여 서 해결 할수 있습니다.



각 펑션이 현재 가지고있는 object를 context로 가지기 때문에 앞선 gdl이 사라져도 문제 없이 동작됨을 확인할수 있습니다.


+ Recent posts