0

明らかな何かが欠けているような気がします。JavaScript モジュールから変数を返していますが、未定義のまま戻ってきます。

モジュールは次のとおりです。

var MyNs = MyNs || {}; 
MyNs.Global = function () {
   var privateTestVar;
   var init = function () {
       if (privateTestVar == null ) {
           privateTestVar = "this is a test" ;
           console.log( 'Init: ' + privateTestVar);
       }
   };

   var Public = {
       init: init,
       TestVar: privateTestVar
   }

   return Public;
} ();

呼び出しは次のとおりです。

MyNs.Global.init();console.log( 'Called: ' +MyNs.Global.TestVar);

init 関数の console.log は正常に機能し、値を返しますが、他のコンソール ログは undefined を返します。私はそれを完全に見逃しています。どんな助けでも大歓迎です。

更新: コードを少し変更して、次のようにしました。

    var privateTestVar = function () { return 'Test!'; }

var Public = {
    TestVar: privateTestVar
}

そのバリエーションですが、コンソールに次の正確なテキストを返します: "function () { return 'Test!'; }"

4

4 に答える 4

3

Publicここに割り当てられた時間:

var Public = {
    init: init,
    TestVar: privateTestVar
}

privateTestVarはまだ定義init()されていない (まだ実行されていないため) ため、TestVarプロパティは is の値に初期化されprivateTestVarますundefined

TestVarプロパティには の値が割り当てられますprivateTestVar。最初に未定義の場合 (この場合は未定義)、TestVarプロパティに別のものを割り当てるまでそのままになります。privateTestVarおそらくあなたが期待していた将来の値を自動的に継承しません。Javascript には、ある変数が常に別の変数に割り当てられているものを含むように指定する方法がありません。 privateTestVarおよび TestVar` プロパティにはそれぞれ独自の値があります。1 つの変数に何かを割り当てても、他の変数には影響しません。

于 2013-05-31T02:05:00.663 に答える
1

代わりにゲッターを使用して、プライベート変数を本当にプライベートなものにすることをお勧めします。これは正しく動作します:

var Public = {
    init: init,
    getVar: function() { return privateTestVar; }
}

MyNs.Global.init();console.log( 'Called: ' +MyNs.Global.getVar());
于 2013-05-31T02:07:44.820 に答える
0

問題は @jfriend00 が述べたとおりです。コードを次のように変更します

var init = function () {
    if (privateTestVar == null ) {
        privateTestVar = "this is a test" ;
        Public.TestVar = privateTestVar;
        console.log( 'Init: ' + privateTestVar);
    }
};

私はこれをテストしませんでしたが、理論的にはうまくいくはずです。

于 2013-05-31T02:11:31.190 に答える