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이 사라져도 문제 없이 동작됨을 확인할수 있습니다.
'개발일지(Language) > JS(JavaScript)' 카테고리의 다른 글
[JavaScript] Array.prototype 종류 [1] concat ,fill, filter, find, findIndex, includes, indexOf (0) | 2018.11.11 |
---|---|
[JavaScript] map,forEach 자바스크립트 (0) | 2018.08.17 |
[JavaScript] 호이스팅(hoisting) (0) | 2018.07.09 |
[JavaScript] 함수의 유효범위 (Effective range of "Function") (0) | 2018.07.09 |
[JavaScript] map 필요없다 reduce!!! (0) | 2018.06.26 |