我对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
};
}());
答案 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
指的是正在创建的对象。