在模块之间传递对象引用

时间:2012-06-30 20:20:15

标签: javascript

我对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
    };

}());

1 个答案:

答案 0 :(得分: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指的是正在创建的对象。