2016-09-19 2 views
0

여기 내 사용 사례입니다 : 사용자가 버튼을 쳤을 때참조 된 변수를 null로 설정하는 방법은 무엇입니까?

Phaser.io에

가, 내가 로컬 let newSquare 변수에 Phaser.sprite를 설정하고, 나는 Phaser.sprite의 Squares 배열에 .push().

나중에 destroy 함수를 호출하여 newSquare 변수에 함수를 호출 한 다음 null로 설정합니다. 스프라이트가 .destroy() 뒤에 화면에서 잘 지워지는 동안 내 Squares 배열에서 여전히 액세스 할 수 있습니다 ...

newSquare 변수를 null로 설정하면 개체가 될 것이라고 생각했습니다. 다른 모든 참조들에 대해서도 null이 될 것입니다.

Squares 배열의 내 참조가 null로 설정되지 않았습니까?

발췌 : 내가 여기서 뭘

eventFunction (e, i) { 
     let newSquare = Game.add.sprite(Lines.attack.a, 0, 'square'); 

     // Some other methods call here 
     Squares[ e.target.dataset.line ].push(newSquare); 

     setTimeout(() => { 
     if (newSquare) { 
      newSquare.destroy(); 
      newSquare = null; 
      console.log(Squares); // will print an array with an iteration corresponding to newSquare object, when I want it to be set to null, in order to clean the array with a _.pull() 
     } 
     }, (2 * 1000)); 

} 

를 놓친 거지? 감사합니다.

+2

아니요. 같은 "것"에 대한 여러 참조를 가질 수 있습니다. 이러한 참조 중 하나를 null로 설정해도 다른 참조가 무효화되지는 않습니다. 그러나'.destroy() '를 호출하면 그것들이 무효화됩니다. 당신은 명시 적으로 객체를 파괴 했으므로, 다른 참조를 사용하는 다른 객체가 현재 파괴 된 객체에 "포인터"를 사용하려고합니다. 그것은 당신의 집 주변에 "침대 밑의 서랍에 양말"이라고 말하는 3 개의 노트가있는 것과 같을 것입니다. postits 중 하나를 태우면 여전히 서랍에 양말이 있습니다. 그러나 당신이 서랍을 태우면 그 노트는 거기에 양말이 있다고 말할 것입니다. –

+0

@MarcB Phaser에서'.destroy'가 정확히 무엇을하는지는 모르겠지만 양말 서랍을 닫고 잠그는 것이 더 나은 비유라고 상상해보십시오.그래서 아직 거기에 있습니다, 모든 징후는 여전히 그것을 가리키고, 아마 여전히 양말이 있지만 당신은 그들에게 갈 수 없습니다. – vlaz

답변

2

원래 생성 된 개체에 대한 참조 만 무효화됩니다. 객체는 여전히 메모리에 존재하며 배열 액세스를 통해 객체에 대한 참조를가집니다. 즉, 가비지 수집되지 않습니다. 배열 내에서 무효화해야합니다 ...

다음은 문제의 단순화 된 버전입니다.

let x = {a: 1, b: 2, c: 3}; 
let y = x; 

x = null; 
console.log(y); 
// => {a: 1, b: 2, c: 3} 

I 메모리에 항목에 대한 참조를 유지하고 당신 push 에드로 배열 내의 객체의 인덱스를 찾기 위해 그 참조를 사용 말하고 싶지만. 예를 들어,

array.find(el => el === reference) 

... reference 이전에 null에 할당 된 식별자입니다.

요소를 무효화하고 배열 내의 현재 위치를 유지하는 방법은 reference을 사용하여 컬렉션을 매핑하여 항목을 찾습니다. 예를 들어,

array = array.map(el => el === reference ? null : el) 

당신은, 현재 위치에서 요소를 수정하는 추이 적 방법을 찾고 forEach(..)를 사용하는 경우. 당신이 단락 반복하려는 경우 그래서, 예를 들어,

array.forEach((x, i, arr) => { 
    if (x === reference) { 
    arr[i] = null; 
    } 
    return; 
}); 

forEach 호출, 배열의 각 요소를 방문, indexOf 루프를 사용해보십시오.

const i = array.indexOf(reference); 
array[i] = null; 
+1

'array.map (...)'은 배열을 제자리에서 수정하지 않을 것입니다. – vlaz

+0

네 말이 맞아. 나는 "자유롭게" "적절한 곳에서"사용했다고 생각한다. 배열의 현재 위치를 의미했습니다. 나는 이것을 변이체'forEach (..)로 바꿀 것이다. – wpcarro

+0

그래서,'newSquare' 변수는 내 객체가 시작되는 메모리 영역을 참조합니다. 하지만 어떻게하면 newSquare를 통해이 메모리 주소에있는 것을 해제 할 수 있습니까 ?? 객체에 액세스하여 메서드를 호출 할 수 있다면 "내 newSquare가 가리키는 위치에 0 비트를 넣으십시오"라고 말할 수있는 방법이 있어야합니다. –

관련 문제