IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

JavaScript の名前空間

JavaScript での大規模開発では

シンボルの衝突が非常に大きな問題となる。その代表例が Firefox拡張機能内のシンボルである。

で、こんな記述ルールはどうだろう

window['http://d.hatena.ne.jp/amachang/']={}; // URI

(function(){with(this){

  // ここにコードを書く

}}).apply(window['http://d.hatena.ne.jp/amachang/']); // URI
例えば
window['http://d.hatena.ne.jp/amachang/']={};

(function(){with(this){

  var hoge     = 'hoge'; // このスコープ内で共有するシンボル
  this.fuga    = 'fuga'; // 同じ名前空間で共有するシンボル
  window.piyo  = 'piyo'; // グローバルで共有するシンボル

  alert(hoge); // hoge
  alert(fuga); // fuga
  alert(piyo); // piyo

}}).apply(window['http://d.hatena.ne.jp/amachang/']);

(function(){with(this){

//alert(hoge); // (Error)
  alert(fuga); // fuga
  alert(piyo); // piyo

}}).apply(window['http://d.hatena.ne.jp/amachang/']);

alert(piyo); // piyo

問題点

あまりスコープを重ねるとシンボル探索とスコープチェーン構築*1に時間がかかるようになって全体の速度が少し遅くなる。
まあ、保守性とのトレードオフということですね。

*1:すべての関数開始時に行われる