• ベストアンサー

【変数消去】できるのかな??

変数を宣言して値を入れて それを消す方法はありますか?? var a =1; この"a"という変数の入れ物じたいを スコープから消せますか?? nullを入れるとnullのままだし。 どうしたらいいか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

delete というアクションで削除できます。 例えば、 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //変数aを作成  var a = 1;  trace( a );  //変数aを削除  delete a;  trace( a ); というようなスクリプトを書くと、2回目の trace アクションでは undefined (未定義)と表示されます。 ********************************** ただし、以下の場合は削除できません。  ・ function の中で var を付けて宣言したもの。    この変数はローカル変数といって、その関数の中だけで使える変数です。    関数が終了すると同時に、自動的に削除されます。  ・ムービークリップの _x など定義済みのプロパティや、Flash で予め用意されているオブジェクト。    デバッガで見た時、「プロパティ」のタブに表示されるものは削除できません。    ちなみに onEnterFrame や onRelease などは定義済みプロパティではないので、delete で削除できます。  ・ attachMovie 等で作成したムービークリップや、ステージに配置したオブジェクト。    スクリプトで作成したムービークリップは、delete ではなく removeMovieClip メソッドで削除します。  ・他の変数に参照がコピーされているもの。    参照とは、変数がある(メモリ上の)場所を示す情報のことです。    delete で変数自体はなくなりますが、この参照を持つ変数が他に存在している限り、値はなくなりません。 参照が保存されている場合の例はヘルプにサンプルがあります。 シンタックス4をご参考になさってください。  ・ Flash ドキュメンテーション: delete ステートメント   http://livedocs.adobe.com/flash/8_jp/main/00001865.html ↑ ref1 は delete により削除されて消えますが、ref2 に ref1 の参照がコピーされているため、値はそのままメモリ内に残ります。 ref2 には ref1 を使って値を保存した場所、つまり値があるメモリ上の場所が記録されていますから、ref2 を利用して ref1.name と同じ値を取り出すことが可能です。 しかし、ref1 は消えてしまっているので、ref1.name では値を取り出せません。

dizzdive
質問者

お礼

詳しい解説ありがとうございます。 さきほど、 「ActionScriptビジュアルリファレンス」 という本を買って調べたら見つかりましたが そこまでの解説は載っていませんでしたから とても参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 変数の宣言をグローバルにしないと変数の参照が出来ま

    変数の宣言をグローバルにしないと変数の参照が出来ません。 ソース全体はカプセル化のために即時関数で囲っています。 function found内で小数点第三位までで四捨五入するようにする処理が共通なので関数化したのですが、 var gramNumを外で宣言しないと参照できずにgramNumが定義されていないと出てしまい困りました 関数スコープの影響だと思い宣言を外に出したのですが、それでも定義されていないと出て、 最終的にグローバル変数にしてやっとうまくいきました。 スコープは自分より上のスコープの変数は参照できるようですが if(xGramEmptyFlag === true) {ないの式がroundの上にあるvar gramNumを参照する場合、 if分の中にある式の一つ上のスコープなので参照できると思ったのですがなぜできないのでしょうか? varはブロックスコープがないので一つ上ではなく同じスコープにあることになるのでしょうか? ただその場合も同じスコープの変数は参照できるのではないのでしょうか?

  • Flash 変数宣言

    これまた超基本的な事ですが、 Flash(AS3)で変数宣言をする際の記述方法について質問させてください。 現在自分がやっている方法では、変数宣言する際 --------------------------------------------------------- var hensu:String = "あいうえお"; --------------------------------------------------------- としていて、これを例えばrootから ムービークリップ「mc」内に変数「hensu」を作る場合 --------------------------------------------------------- mc.hensu = "あいうえお"; --------------------------------------------------------- としています。これで特に問題ないのですが、 値を何も入れず、とりあえず変数だけ用意しておく場合、 rootに変数を作る時は --------------------------------------------------------- var hensu:String = new String(); --------------------------------------------------------- としています。また、 --------------------------------------------------------- var hensu:String; --------------------------------------------------------- だけでも、変数が作成されているよう?なのですが・・・ trace()で調べると new String()の場合は値が"空白"(何も表示されない) hensu:String;の場合は"null"になります。 という事はどちらの場合でも単純に変数だけ作るのであれば これで機能していると考えてもよいのでしょうか? この"空白"と"null"の違いを理解したいです。 また、rootからムービークリップ「mc」内に変数「hensu」を作る場合として、 --------------------------------------------------------- mc.hensu = new String(); --------------------------------------------------------- とすれば、大丈夫ですが --------------------------------------------------------- mc.hensu:String = new String(); --------------------------------------------------------- や --------------------------------------------------------- mc.hensu:String; --------------------------------------------------------- ではエラーが出ます。 root上に変数を作る時の --------------------------------------------------------- var hensu:String = new String(); --------------------------------------------------------- や、別の場所に変数を作る場合でも --------------------------------------------------------- mc.hensu = new String(); --------------------------------------------------------- では問題ないのに、 ●●●.変数:型 = new 型(); の形にするとエラーが出るのはなぜなのでしょうか? (記述方法が間違っているといわれればそれまでですが・・・)

  • phpでの局所変数

    phpで、perlでいうlocalやmyのような宣言はできないのでしょうか? function a() {  if(1){   $a=2;   print "$a<br>";  }  print "$a<br>"; } としても2が2つ表示されてしまいます。 ある関数内で場所を問わず宣言したグローバル変数でない変数のスコープは、宣言場所がどこであれ、「関数内」となるのでしょうか?

    • ベストアンサー
    • PHP
  • javascriptのレキシカルスコープについて

    JSのレキシカルスコープがわかりません。 JSだと、一番外側のスコープで var str = "一番外側のスコープ"; とすると それ以降、ユーザー定義関数の中の、いわゆる関数スコープ内でも var str; と関数内で再定義しない限り、str = "一番外側のスコープ";を つかいまわすことになりますよね? 一度、関数内で、値を変更すると親スコープでもその変更が生きたままになると思います。 var str ="一番外側のスコープ"; function test(){ alert(str); str ="値の変更"; } alert(str) // 関数内で値をかえたけど、それが親スコープにも反映されてしまう。 このことがレキシカルスコープでしょうか? ただ、どこかのサイトで var num = 100; function makefunc() { return function() { alert(num); } } function callfunc() { var num = 50; var func = makefunc(); func(); }; callfunc(); でmakefunc()関数を呼び出した際の 関数内のnumという変数の値が100になるというのです。 実際、実行するとその通りなのですが、 var num = 50; という宣言は、callfunc() という関数の関数スコープ(ローカルスコープ) というのは理解しています。 でその中のいわゆる内部関数というのでしょうか? var func = makefunc(); func(); を実行した際の 変数numというスコープが 一番最初に宣言した  var num = 100; という値をさすというのです。(※そのサイトではこれをレキシカルスコープと呼んでいました) いったどういう動作がレキシカルスコープなのでしょうか? 他にも、クロージャともごっちゃになっております。 識者の方ご教授ください。 参考元はここです http://garden-place.jp/tech/javascript/scope-chain.html

  • 変数について

    <scitp>の中(関数の中じゃない)で初期化した変数は、 ほかの<script>の中でも有効で var x;と宣言しても有効。 関数の中で初期化した変数は同じ<script>の中ならどの関数にも有効で、 var x;と変数宣言した場合は、その関数の中でのみ有効。 この解釈で正しいですか?

  • グローバル変数とローカル変数について

    今JavaScriptを勉強している初心者です。 実は、ある本に書かれているソースコードでグローバル変数とローカル変数の違いがよく分からなくなりましてここに質問させて頂く次第です。 まずは、ソースコードを書きます。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title>変数のスコープ</title> <script type="text/javascript"> function testFunc(){ var num; num=5; } </script> </head> <body bgcolor="#FFFFFF"> <p style="font-size:200%"> <script type="text/javascript"> var num=3; testFunc(); document.write(num, "<br>") </script> </p> </body> </html> このままだとブラウザに表示されるのはグローバル変数「3」になるというのも今一分からないのですが。 この次に<head>部分の var num; をコメントにします。 すると、何故かローカル変数「5」がグローバル変数になり、<body>部分のtestFunc()メソッドの結果ブラウザに表示される値が「5」になるというものです。 var num; をコメントとする事はnumは変数宣言されていないことになります。 なのに num = 5; が成り立つのもよく分かりません。 そこでアドバイスを頂きたくここに書き込む事にしました。 是非とも宜しくお願い致します。

  • JavaScriptの変数について

    JavaScriptのソースで解らないところがあり、困っています。 ソースは下記の様なものなのですが、エラーが出ていません。 解らない点は2点有ります。 1. jにfalseを代入している箇所なのですが、セミコロンがないのは何故なのでしょうか? Chromeのデベロッパツール, FireFoxのFirebugで確かめてみたのですが、エラーとなっておらず、alertでfalseと表示されている状態です。 「j = !1」の箇所を即時関数の外に出すと、エラーとなります。 普通変数に代入する式の末尾はセミコロンをつけると思うのですが、 何故なのでしょうか? 2.また、jはvar j等のように変数の宣言をせずに使えているようなのですが、 普通即時関数内で宣言した変数のスコープは関数の外では使えないので、エラーとなると思うのですが、宣言せずに代入に使った変数はグローバル変数と解釈されるのでしょうか? どなたかお答え下さい。 --------------------------------- <script> (function() { j = !1 })(); alert(j); </script>

  • java ローカル変数の値について

    素人ですが、どうぞ宜しくお願いします。 ローカル変数について教えてください。 リストビューでクリックされたアイテムをonItemClickメソッド内の変数に格納されているのですが、 通常スコープ外ではこの値は参照できないですよね? このようなローカル変数をスコープ外で参照する方法はあるのでしょうか? たとえば別のクラスや、別のメソッド内など。 ローカル変数の値を、メンバ変数に送るようなことって可能ですか? リストビューで選択された値を使いまわしたいのですが、 そんな方法がありましたら、ぜひご教授いただけないでしょうか? 宜しくお願いいたします!

    • ベストアンサー
    • Java
  • スコープ内の処理終了次第変数の中身が捨てられる

    スコープ内の処理終了次第変数の中身が捨てられるので、困ります。 フラグが使えません。 グローバルで宣言するとできるのですが、こんなに離れている管理しにくくないですか? もっと近くで残すことは仕様上できないのでしょうか? グローバル var emptyElement; これはずっと残っているグローバルは中身がスコープ内の処理が終わってもずっとリロードするまで残る仕様??? 即時関数内下   var emptyElement; クリック終了次第中にが捨てられる aaa.addEventListener('click', function() { emptyElement = true; } });

  • 変数に入っている変数の値を参照したい場合には

    var a1="123"; var a2="789"; と 変数に文字が登録されている場合、 引数として、1又は2を渡し、 1の場合にはa1を 2の場合にはa2の値を 参照することは可能ですか? switchやif文を使わずに、 別の変数に、"a"+引数を代入し、 その変数に代入されている変数を参照する というようなことは可能ですか? 意味わかりますか? すみません。 よろしくお願い致します。