2010-12-04 12 views
0

私はTabListのこの定義があります:私はこれを呼び出すときしかし、JavaScriptのスコープの混乱

MyApp.TabList = function (selector) { 

    var private = { 
     $list: $(selector), 
     tabs: [] 
    }; 

    this.add = function (tab) { 
     private.tabs.push(tab); 
    }; 
}; 

を、そしてthis.addの体内に侵入、privateはローカルスコープには表示されません。

MyApp.tabs = new MyApp.TabList("#tabs"); 

$("#tab-add").click(function() { 
    MyApp.tabs.add(new MyApp.Tab("title")); 
}); 

privateはオブジェクトの内部に保持されませんか?

このコードが上記のようにスタンドアロンで動作する場合、私は何かを見逃している可能性があります—私は実証的な目的のために私ができる限りベストを尽くそうとしました。

+0

@Agile一般的に、 'return this;'でコンストラクタ関数を終了したいとします。私はそれが違いをもたらすとは思わないが、それは(私が聞いたことから)良い練習である。 –

+0

@Agile 'private'変数は' add'関数のローカルスコープにあるとは限りません。外側のスコープ( 'TabList'コンストラクタ関数のスコープ)にあります。 –

+2

@ŠimeVidas:ハァッ?どうしてそうするか?あなたが 'new'を使っているのであれば、決してそれをする必要はありません。あなたは 'new'キーワードなしで動作させる場合にのみこれを行います。 –

答えて

2

クロージャのプロパティのために、変数は間違いなくadd()関数内で使用できるはずです。

これは答えではないかもしれませんが、privateはJavascriptキーワードです。変数の名前として使用することは避けてください。未知のバグが発生し、時にはデバッガが助けにならないことがあります。それを打つと、それが動作すれば私たちに知らせる!

+0

+1良いキャッチ:) –

+0

"プライベート"をアンダースコア文字に変更し、問題が解決しない場合。 :( – AgileMeansDoAsLittleAsPossible

+0

@Agile何が問題なのですか?エラーがスローされますか? –