

宣言をした変数はいつまで残り続けるのでしょうか？  
聞いたところ、その変数が所属する関数のスコープ内の処理が終了したときに、  
変数も破棄される。  
また、グローバル変数の場合はずっと常に残っているのでいつで使える

と聞いたのですが、この認識で正しいでしょうか？

JSについてです。

また、クラス上で宣言した変数の場合はすべてがグローバルになるのでどこからでも参照できるようですが、  
グローバル変数と同じで破棄されることがなく常に存在すると考えてよろしいでしょうか？


CC BY-SA 3.0
2017-05-10T14:16:30.083
34611
2017-05-14T02:30:22.283
2017-05-14T02:30:22.283
3054
20834
question
javascript
宣言をした変数はいつまで残り続けるのでしょうか？


### ガベージコレクション(GC)

JavaScriptの変数のメモリ開放はECMAScript規定外の為、基本的に実装依存ですが、ガベージコレクション(GC)で回収されるまでは残るという考えが一般的です。  
具体的には「関数スコープ内で該当変数を参照しなくなった場合」が該当し、それ以降はガベージコレクションで回収されるであろうと推測できます。

  * [JavaScript - javascriptの変数のメモリへの割当について(72635)｜teratail](https://teratail.com/questions/72635)

### グローバル変数

グローバル変数はページが `unload` されるまではメモリに残り続けます。  
つまり、ページ遷移、[閉じる]、[更新]、[戻る]、[進む] のタイミングでメモリから破棄されます。

### ローカル変数

ローカル変数は関数実行完了後、実装が任意のタイミングでメモリから破棄します。

[code]

    <script>
    (function (x) {
      console.log(x);
    }(1));
    // 関数実行終了時に匿名関数及びローカル変数xはメモリから破棄される
    </script>
    
[/code]

ただし、関数スコープがローカル変数を参照し続ける場合は別です。

[code]

    <script>
    var getX = (function (x) {  // 変数x は関数 getX から参照され続ける
      return function getX () { return x; };
    }(1));
    console.log(getX());
    </script>
    
[/code]

グローバル変数 getX はページが `unload` されるまでメモリに残り続けます。  
関数 `getX` は変数 `x` を参照し続ける為、変数 `x` もページが `unload` されるまでメモリに残り続けます。  
クロージャは関数を入れ子にするだけで簡単に生成されるものなので、メモリ節約の為には不必要に関数の階層を深くしない工夫が必要になります。

### クラス

クラスも上述と考え方は同じです。  
それがグローバル変数であったり、関数スコープから参照し続けるローカル変数でなければ、実行完了後にメモリから破棄されます。

Re: temestack さん


CC BY-SA 3.0
2017-05-10T15:26:45.227
34614
2017-05-10T15:26:45.227
20262
34611
answer