ガベージコレクション
メモリに関してはガベージコレクション(どこからも参照されなくなったら開放される)の仕組みを理解して上手く管理する必要があります。
グローバル変数を使用するとページを閉じるまでメモリが開放されず、他の変数との衝突が起きるリスクがある為、出来る限りグローバル名前空間を使用しないことを推奨します。
また、クロージャの扱いには気をつけてください。
JavaScript
1'use strict';
2(function () {
3 function sum (a, b) {
4 return Number(a) + Number(b);
5 // a, b はガベージコレクションによって回収される
6 }
7 function multi (a, b) {
8 return a * b;
9 // a, b はガベージコレクションによって回収される
10 }
11 function sub (a, b) {
12 return Number(a) - b;
13 // a, b はガベージコレクションによって回収される
14 }
15
16 function main () {
17 console.log(sum(1, 2)); // 3
18 console.log(sub(1, 2)); // -1
19 console.log(multi(1, 2)); // 2
20 }
21
22 main();
23 // sum, multi, sub, main はクロージャで参照を保持するのでガベージコレクションでは回収されない(ページが閉じられるまでメモリを消費し続ける)
24}());
prototype パターン
メモリ消費の観点では「prototype
パターン」と「this
パターン」で比較される事が多いようです。
JavaScript
1'use strict';
2function Hoge1 () {} // prototype パターン
3Object.defineProperty(Hoge1.prototype, 'foo', { // prototype 拡張なので new Hoge1 する度にメモリを消費せず、メモリ消費が this パターンよりも少ない
4 writable: true,
5 enumerable: false,
6 configurable: true,
7 value: function foo () { console.log('Hoge1'); }
8});
9
10function Hoge2 () { // this パターン
11 Object.defineProperty(this, 'foo', { // this 値に定義するので new Hoge2 する度に foo を生成してメモリを消費する
12 writable: true,
13 enumerable: false,
14 configurable: true,
15 value: function foo () { console.log('Hoge2'); }
16 });
17}
18
19new Hoge1().foo(); // Hoge1
20new Hoge2().foo(); // Hoge2
Re: ゲストユーザー さん