2012-05-17 8 views
2

다음 코드를 살펴보면 누군가가 JavaScript에서 값을 전달하는 방법을 설명 할 수 있습니까? 다른 기능에서 다음자바 스크립트 변수 할당?

function loadImages() { 
    for(var sec in images) { 
    theme = images[sec]; 
     for(var tsec in theme) { 
     theme[tsec].img = new Image(); 
     theme[tsec].img.src = 'images/'+theme[tsec].src+'.png'; 
     } 
    } 
} 

는 :

function definitionToSpriteDataMapping() { 
    var result = {}; 
    for(var definition in blocks) { 
    var sprite = blocks[definition].sprite; 
    for(var secnm in images) { 
     section = images[secnm]; 
     for(var spritenm in section) { 
     if(sprite == spritenm) { 
      result[definition] = {}; 
      result[definition].img = section.img; 
     } 
     } 
    } 
    } 
    return result; 
} 

나는 단순 위해 몇 가지 코드를 잘라하지만 여전히 매우 복잡한. 기본적으로 중첩 된 키 : 값 쌍인 두 개의 객체 (이미지 & 블록)가 있습니다. "화상"에는 .IMG가 .IMG 첨가 코드의 첫 번째 블록 전에 없다

section = images[secnm]; 
result[definition] = {}; 
result[definition].img = section.img; 

코드의 두 번째 행의 코드

theme = images[sec]; 
theme[tsec].img.src = 'images/'+theme[tsec].src+'.png'; 

의 제 1 블록이 "인 테마". 그러나 이것은 두 번째 코드 블록에서 볼 수 있듯이 "이미지"로 다시 반영됩니다. JavaScript에서 포인터와 같은 모든 객체입니까? "결과"는 "주제"가 "이미지"와 "블록"과 동일한 관계를 가질 것입니까? "theme"에서 요소를 제거하면 "images"에 반영됩니까?

+0

'i = new Image(); i.img.src = 'images /'+ theme [tsec] .src + '. png'; 테마 [tsec] = i;'당신에게 더 이해가 되겠습니까? –

답변

4

당신이 실제로 메모리에서 해당 개체에 대한 포인터를 생성합니다 theme = images[sec] 사용. 따라서 imgtheme 개체에 추가하는 것은 같은 개체이므로 해당 이미지에 img을 추가합니다. 예, result도 마찬가지입니다.
이러한 방식으로 참조 된 개체의 속성을 변경, 추가 또는 제거하면 실제 개체에 영향을줍니다. 어레이에서도 마찬가지입니다.

동작이 마음에 들지 않으면 개체를 복제해야합니다.

var original = { name: "James", age: 73, male: true }; 
var clone = { }; 
for(var k in original) 
    clone[ k ] = original[ k ]; 

을하지만 original의 속성은 배열 또는 객체 자체 경우,이 참조 될 것입니다 : 당신은 단순히 모든 속성을 복사하여 간단한 개체를 복제 할 수 있습니다. 속성으로 객체 나 배열이 없으면 위의 코드 조각이 정상적으로 작동합니다. 그렇지 않으면 복제 기능을 작성하고 원본의 모든 구성원을 반복적으로 복제해야합니다.

2

JavaScript의 포인터와 같은 모든 객체입니까?

사실, JavaScript에서 Object는 "참조 유형"이라고 일반적으로 더 많이 언급 될 것이라고 생각합니다.

var a 오브젝트를 참조하는 경우

avar b에 할당되고 a 보유한다는 b, 그래서 a를 기준의 복사본을 얻을 것이다 b 모두 메모리에 동일한 오브젝트 데이터를 참조한다.

a 참조에서 변경된 내용은 b 참조에서 관찰 할 수 있습니다.

이 값은 여전히 ​​"값"할당이지만 복사 된 값은 개체 자체가 아니라 참조 값입니다.

1

images[sec][tsec] 두 경우 모두 메모리의 매우 동일한 개체를 참조합니다. theme = images[sec]을 수행하면 개체의 복사본이 만들어지지 않습니다.

이 동작의 더 사소한 예는 이것이다 :

var obj = {}; 
var obj2 = obj; 

obj.a = 123; 
obj2.a; // 123