概要
今日はJavaScriptのグローバル変数の衝突について調べたことをまとめます
JavaScript勉強シリーズ
- JavaScriptのthisについてメモ
- JavaScriptのコンストラクタについて
- JavaScriptのwindowについてのメモ
- JavaScriptのプロトタイプ継承について
- JavaScriptのプロトタイプチェーンについてメモ
- JavaScriptのスコープについてメモ
- JavaScriptの論理演算による存在チェックについて
- JavaScriptのクロージャについてメモ
- JavaScriptのグローバル変数の衝突について
グローバル変数の衝突について
JavaScriptでグローバル変数を作成した際、JavaScriptファイルを複数に分割してもお互いにグローバル変数が見える世界になっているので、あるファイルで使った名前は別のファイルで使えない
このような名前空間の汚染を回避する方法を調べてみる
オブジェクトプロパティへの閉じ込め
オブジェクトリテラルで作成したオブジェクトのプロパティにして名前をオブジェクトの中に閉じ込める
var TestModule = { x: function(a){ return a * a; }, y: {p:2, q:5} }; print(TestModule.x(5)); // 25 print(TestModule.y.p); // 2 // xはTestModuleの中に閉じ込めているので他のコードでは使用できる print(x); // Exception: ReferenceError: Can't find variable: x
このやり方だと1コードあたり1変数名だけに収まる
良いところ | 名前の衝突の問題は概ね回避できる |
課題点 | 元々のグローバルスコープが広いという問題は残る |
クロージャによる隠蔽
クロージャを活用して外部から見えない名前を作成する
var hoge = (function(){ var x = {p:3, q:5} return function() {return x.p + x.q;} })(); print(hoge()); // 8
関数スコープによる名前の閉じ込めとクロージャによって関数実行後もローカル変数が生きているという2つの特性を生かした隠蔽方法
アクセス修飾子について
JavaScriptのはprivateやpublicなどアクセス修飾子がない
その代わりに関数スコープとクロージャを使ってアクセス修飾子っぽいことができる
function get_set_class() { var x = 0; // ここにプライベートは変数や関数を宣言できる return { // 公開メソッド get:function() {return x;}, set:function(num) {x = num; return this;} // return thisはメソッドチェーン用 } } var hoge = get_set_class(); print(hoge.get()); // 0 hoge.set(3); print(hoge.get()); // 3 print(hoge.set(5).get()); // 5 (メソッドチェーン) // xには直接アクセスできない print(x); // Exception: ReferenceError: Can't find variable: x print(hoge.x); // undefined
コメントを書く
コメント一覧