2016-12-21 6 views
2

私は理解:これを削除するのはJSで意味がありますか?

var obj = { 
    foo: 'bar' 
}; 

delete obj.foo; 

objオブジェクトにペアキー/値foo/'bar'を削除します。つまり、オブジェクトにコンテンツ'bar'への参照を解放します(つまり、ある時点でガベージコレクションされます)。

また、私は書くことができます:

delete obj; 

それは次のように行くシーンの背後にあるよう:objへの参照せずwindowを残し

delete window.obj; 

私は、thisキーワードがJSでどのように機能するのか完全にはわかりませんが、メソッド実行にバインドされたオブジェクトだと私は考えています。

しかし、私はそれを書くために理にかなっているかわからない:

delete this; 
  • どのオブジェクトから参照が削除されていますか?
  • return this;に電話するとどうなりますか?null

特に私はnewで構築されたオブジェクトを破壊しようとしている:

function MyClass() = { 
    return this; 
}; 

MyClass.prototype.destroy = function() { 
    delete this; 
}; 

var myInstance = new MyClass(); 
myInstance.destroy(); 

myInstance本当に削除していますか?すべてのメモリが解放されていますか?

おかげ

+1

なぜそれをやろうとしますか?どのような問題を解決しようとしていますか?ガベージコレクタは、自動的に* 99%のケースで動作します – smnbbrv

+0

このコードはコンパイルされません。 –

+0

@DanLoweコンパイルしませんか?何? –

答えて

3

また、私は書くことができます:

delete obj; 

それはのように行くシーンの背後にあるよう:

delete window.obj; 

いいえ、あなたはできない、とノーそうでありません。それは何もしません。

var obj = { 
 
    foo: 'bar' 
 
    }; 
 
    delete obj; 
 
    console.log(obj);

しかし、私はそれを書くために理にかなっているかわからない:

delete this; 

も何もしません。

function foo() { 
 
    delete this; 
 
    console.log(this); 
 
} 
 

 
var bar = { 
 
    foo: foo 
 
}; 
 

 
bar.foo();

deleteのみオブジェクトからプロパティを削除します。

5

myInstance本当に削除していますか?すべてのメモリが解放されていますか?

That's what delete never did.

は、どのオブジェクトからの参照が削除されていますか?

これはありません。 thisキーワードはプロパティ参照ではなく、代わりにリテラルのように動作します。この構成は、delete 0と同じくらい意味があります。

同様に、ローカル変数はプロパティ参照ではありません。 strictモードでは、deleteにしようとすると例外が発生します。 delete thisがなぜ投げないのだろうと思う。

関連する問題