JavaScriptのプライベート変数の作り方

JavaScriptを書き始める時に気になるもの、オイラの場合は名前空間。特にMozilla系アプリの拡張機能を作ろうとした時、他の拡張と被っていたらどうしよう...とビクビクしている。
ということで、一つのグローバルなオブジェクトを宣言してその中にオブジェクトを連ねる。
でも、その中には他から触られたくないプライベートな変数もある。

function Hoge(){
  var hoge;
  this.setHoge = function(str){
    hoge = str;
    return str;
  }
}
var foo = {};
foo.hogehoge = new Hoge();

とか何とかすれば、hoge変数はプライベートな変数となるわけだが、一つしか作る予定のないものにわざわざクラスを作ってnewするのも面倒だし、グローバルな位置にHoge関数が置かれてしまう。
で、苦肉の策でやってみたのが、これ。

var foo = {};
foo.hogehoge = (function(){
  var hoge;
  return {
    setHoge = function(str){
      hoge = str;
      return str;
    }
  };
}();

同じ要素を頻繁に使う場合、

var foo = {};
foo.hogehoge = function(str){
  var elm = document.getElementById('bar');
  elm.setAttribute('value', str);
  return str;
}

とやるんじゃなくて、

var foo = {};

window.addEventListener('load',function(){
  window.removeEventListener('load',arguments.callee,false);

  foo.hogehoge = (function(){
    var elm = document.getElementById('bar');
    return function(str){
      elm.setAttribute('value', str);
      return str;
    }
  }();
},false);

とかやっておくとメソッドが呼ばれる度にdocument.getElementByIdが呼ばれる事なしに、かつ、操作したい要素はプライベートで固定的に使える。

既に使い古されている書き方かもしれないけど、個人的には新発見だった。けど、バッドノウハウな気もするなぁ、コードが読み難くなるし。