0

jsがどのように機能するかを理解する上で何かが欠けています。ここに問題があります:

次のようなモジュールを宣言します。

ns.obj = function() {
    // declare private variables
    var test = 1, test1 = 2;

    // declare some private function
    var myFunc=function(){test=2};

        return{test:test, myFunc:myFunc};
}

関数内でテストを宣言していないため、毎回myFunc呼び出されます。jsは、プライベート変数を参照していると想定する必要があります。

返されたオブジェクトは、モジュールがある場合にtestとmyFuncが表示されていることを確認します。したがって、ns.obj.testを呼び出すと、最初は1になります。そして、myFuncを呼び出した後、2を与える必要があります。しかし、それは常に1です。なぜそれが起こるのでしょうか。

これがjsfiddleです:http://jsfiddle.net/aXuwB/1/

4

3 に答える 3

1

JavaScriptでは、変数を上書きしても他の場所では上書きされません。リターンオブジェクトで事実上1番を渡しています。test変数への参照はありません。

あなたが持っているオプションは関数を返すことです。関数はコードを保持するため、変数への参照を保持できます。これを呼び出すと、変数が得られますtest: function() { return test; }

于 2012-08-23T20:13:59.370 に答える
0

var test=1関数を実行するたびに new を宣言しているという事実に関係していると思います。明確にするために、 を呼び出すns.obj()たびに、新しいテスト変数を 1 に再割り当てし、それをオブジェクトに返します。したがって、値は常に 1 です。

関数を呼び出すと、必要にmyFunc応じてプライベート変数が変更されますが、プライベート変数にアクセスするクリーンな方法はありません (値を再度リセットする必要はありません)。

これを見て、これがあなたが望むものを示しているかどうかを確認してください:

var ns = {};
ns.obj = function(){
    var test = 1;
    this.myFunc = function(){
        test=2
    };
    this.getTest = function(){
        return test;
    }
}

var testObj = new ns.obj();
console.log(testObj.getTest());
testObj.myFunc()
console.log(testObj.getTest());
于 2012-08-23T20:24:41.050 に答える