2

これが私のコードです:

var Test = (function () {
    function Test() {
        this.sum = n;

        this.calculate();
    }

    Test.prototype.calculate = function() {
        n = 5;
        return n;
    }
    return Test;
})();

var mytest = new Test();

n が定義されていない理由を教えてください。return n が助けになると思ったが、私は間違っていた。

4

3 に答える 3

2

コンストラクター関数にバグがあるようです。nあなたはそれを割り当てる前から読んでいます。

おそらく、これはより明確になるでしょう:

function Test() { this.sum = this.calculate(); }

n次に、値を完全に取り除きます。

Test.prototype.calculate = function() { return 5; }
于 2013-03-03T13:47:22.613 に答える
0

あなたが何をしようとしているのかわからないが、これを試してみてください:

var Test = (function () {
    function Test() {
        this.sum = this.calculate();
    }

    Test.prototype.calculate = function() {
        var n = 5;
        return n;
    }
    return Test;
})();

var mytest = new Test();
alert(mytest.sum); // 5

あなたの質問に答えるために-nあなたundefinedがやろうとしていたときにそれは価値がなかったからですthis.sum = n;。最初に呼び出しthis.calculate()てからを割り当てようとすると、機能した可能性がありますthis.sum = n;。しかし、この場合でも、変数をグローバル名前空間にリークしていたため、これは非常に間違っていnました(変数を明示的に初期化しない場合、グローバル名前空間varにリークします- window)。だから私が何を意味するのかを説明するために-これはうまくいくかもしれません:

var Test = (function () {
    function Test() {
        this.calculate();

        this.sum = n; // n is global now, hence accessible anywhere and is defined by this moment
    }

    Test.prototype.calculate = function() {
        n = 5; // not initialized with var so it leaks to global scope - gets accessible through window.n
        return n; // has no sense, since you do not use returned value anywhere
    }
    return Test;
})();

var mytest = new Test();
于 2013-03-03T13:42:24.713 に答える
0

ここで、少し説明しようと思います。

function Test() {
    this.sum = n; // assign undefined to this.sum

    this.calculate(); // n = 5, but doesn't affect this.sum as undefined is already passed to sum
}

正しい行動(あなたが望んでいたこと)

function Test() {

    this.calculate(); 
    this.sum = n; 

}
于 2013-03-03T13:48:03.893 に答える