0

私は JavaScript が初めてで、いくつかのベスト プラクティスを学ぼうとしています。次のコードで ctx 参照にアクセスできない理由がわかりません。ログは、myApp.init() からの context2d 参照を出力します。myApp モジュールの return ステートメントでプライベート オブジェクト変数を公開できませんか? 私はこの言語の基本を理解し始めたと思っていましたが、この一見単純な概念に不満を感じています. ご協力いただきありがとうございます。

window.onload = function () {
    myApp.init();
    console.log(myApp.ctx);        // logs undefined
};

var myApp = (function () {    

    var canvas,
        ctx,
        init = function () {
            canvas = document.getElementById("canvas");
            ctx = canvas.getContext('2d');
            console.log(ctx);        // logs valid context2d object
        };

    return {
        init : init,
        ctx  : ctx
    };

}());

myApp.board = (function () {

    var ctx = myApp.ctx;

    return {
        ctx : function () { console.log(ctx); }   // logs undefined
    };

}());
4

1 に答える 1

0

定義するinit()ために呼び出す必要があります。ctxただし、myApp には ctx の元の値が含まれているため、その時点では手遅れです。

とまったく同じ問題がありvar ctx = myApp.ctx;ます。boardが定義されている場合、ctx の値を取得します。変わればmyApp.ctx変わらない。


これはうまくいくはずです:

var myApp = new function () {
    var canvas;

    this.init = function () {
        canvas = document.getElementById("canvas");
        this.ctx = canvas.getContext('2d');
        console.log(this.ctx);        // logs valid context2d object
    };
};

myApp.board = new function () {
    this.ctx = function () { console.log(myApp.ctx); }
};

キーワードを使用するnewと、関数はコンストラクターになり (すぐに呼び出されます) this、作成されるオブジェクトを参照します。

于 2012-06-30T20:38:49.060 に答える