回答編集履歴
2
メモリ開放云々の説明を修正
answer
CHANGED
@@ -10,7 +10,8 @@
|
|
10
10
|
- [変数宣言のvarアリとナシの違いや使い分け(14790)|teratail](https://teratail.com/questions/14790#r23126)
|
11
11
|
|
12
12
|
**クロージャがメモリ開放しないのは仕様**
|
13
|
-
そもそも論としてクロージャがメモリを手放さないのは内包関数がローカル変数にスコープを持っているからであり、
|
13
|
+
そもそも論としてクロージャがメモリを手放さないのは内包関数がローカル変数にスコープを持っているからであり、スコープを持つ変数をガベージコレクションで回収できない事に起因します。
|
14
|
+
つまり、仕様であってメモリリークではありません。
|
14
15
|
|
15
16
|
**ガベージコレクション**
|
16
17
|
メモリ開放が必要なら[ガベージコレクション](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)によって開放されるようにスコープを調節してください。
|
1
markdown記法の調整
answer
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
> varのつく変数はDontDelete属性がつくため、delete演算子で解放できませんが、上記の例でvarをつけずに、...(中略)...とするのはありですか?
|
2
2
|
|
3
|
-
グローバル変数を使うと内包関数が参照する変数 `x`
|
3
|
+
グローバル変数を使うと内包関数が参照する「グローバル変数 `x`」が共有されてしまいます。
|
4
4
|
クロージャの優位性を失うことになると思うのですが、それはクロージャにする意味があるのでしょうか。
|
5
5
|
また、その例では [Strict Mode](https://developer.mozilla.org/ja/docs/Web/JavaScript/Strict_mode) で `ReferenceError` になります。
|
6
6
|
---
|
7
7
|
|
8
8
|
**DontDelete 属性が存在するのは ES3 まで**
|
9
|
-
|
9
|
+
`DontDelete` 属性が存在するのは ES3 までであり、ES5 では削除されています。
|
10
10
|
- [変数宣言のvarアリとナシの違いや使い分け(14790)|teratail](https://teratail.com/questions/14790#r23126)
|
11
11
|
|
12
12
|
**クロージャがメモリ開放しないのは仕様**
|
13
13
|
そもそも論としてクロージャがメモリを手放さないのは内包関数がローカル変数にスコープを持っているからであり、仕様です(メモリリークではありません)。
|
14
|
+
|
15
|
+
**ガベージコレクション**
|
14
16
|
メモリ開放が必要なら[ガベージコレクション](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)によって開放されるようにスコープを調節してください。
|
15
17
|
ガベージコレクションは「対象がどこからも参照されなくなった時」に自動的にメモリを開放します。
|
16
18
|
|