質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

662閲覧

JavaScriptでのnull設定

BeatStar

総合スコア4958

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

2クリップ

投稿2018/04/30 03:36

くだらない質問かもしれませんが。( 入門書読め と怒られそうなので... )

JavaScript というよりWSHを利用したJScriptというのでしょうか。

それのサンプルで意外と

JavaScript

1// Prototype1プロトタイプがあるとして... 2var obj = new Prototype1(); 3... // 何らかの処理 4obj = null; // <- これ

のようなコードを見かけます。

C++とかのクラスとは違うけどPrototype1というプロトタイプからobjインスタンスを生成して...

までは理解できるのですが、

obj = null; の行は必要なのでしょうか?

一応C++でも

C++

1// Class1クラスがあるとして 2Class1 obj = new Class1(); 3... // 何らかの処理 4delete obj; 5obj = NULL;

のようにそれ以降の処理で間違って使わないようにNULLを入れて明示しているだけの場合があります。

これのような状態でしょうか?

それともC++だとdelete obj; の行に相当するのでしょうか?

JavaScriptの入門書やサイトではJavaScriptの使い方だけで「JavaScript クラス 作成」とかでやっと出てきました。

でも、今回の質問の内容については何も書かれていません。

( もしかして、私の調べ方が悪い? )

強いて言えば、C++でいう

C++

1... 2delete obj; // <- ① 3obj = NULL; // <- ②

のどれなのでしょうか?

つまり、deleteみたいに「無いとメモリリーク等のような不具合を出しやすい」ために obj = null; としているのか、
「以降、これはnullなので使わないでください」のような明示なのか。

もし、メモリリークじゃないにしても、そういう不具合を出しやすいなら付けるべきだし、単なる明示ならなくてもいいはずです。
(自分で管理するなら。)

kawakawa2018👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

例えば、次のケース。

JavaScript

1var element = document.getElementById('sample'); 2 3element.addEventListener('click', (event) => console.log(event.type), false); 4 5element = null; // GCで回収されるのはページが unload される時なので、事前に null で埋めて参照を破壊しておく

ガベージコレクションはそれ(element)が参照される限りはメモリから解放しませんので、clickイベントハンドラ関数が生きている限りは、element を回収しません。
対策として、null で埋めておくことで該当オブジェクトをメモリから解放します。
nullへの参照は残りますが、オブジェクトが残るよりはマシという判断になります。

ここで賢い人は関数が変数 element を参照できない位置に移動すればいい事に気が付きます。

JavaScript

1function handleClick (event) { 2 console.log(event.type); 3} 4 5function main () { 6 var element = document.getElementById('sample'); 7 element.addEventListener('click', handleClick, false); 8} 9 10main();

このコードによって、main実行完了後のタイミングで変数elementをGCが回収する事が期待できます。
これらのコード対比は、IE6のメモリリークパターン対策に苦労した方なら記憶に残っているかもしれません。

一方、クロージャによるメモリ解放不可は ECMAScript 仕様による正式な機能なので、しっかりとスコープを管理しなければ、正しくメモリから解放されない事態に繋がります。

Re: BeatStar さん

投稿2018/04/30 10:19

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まず、JavaScriptの場合、ガベージコレクションといって、使い終わった変数は自動で開放してくれます。今どきのJavaScript処理系であれば、構文上変数が生き残っていたとしても、それ以降のコードで変数が参照されなくなった段階で自動開放してくれることでしょう。

WSHの場合、

  • 関数を切らずに、1スコープが長くなることが多い
  • 処理系が古いため、オブジェクトが本当に参照できなくならないと開放されない

などの事情があって、こんなふうにnullを代入して潰しているものと思われます。ブラウザやNode.jsなどの環境では、あまり必要とならない技法です。

投稿2018/04/30 04:14

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2018/04/30 04:24

要はC++でいえば、しいて言えばdelete ~ に近いのですよね? ( 「これをやらないと開放されない」系という意味で )
maisumakun

2018/04/30 05:00

C++はガベージコレクタのない世界なので、対応した表現はできません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問