我正在构建游戏并试图找出我正在使用的melonJS
游戏引擎的工作方式。我需要创建自己的CanvasRender对象版本,所以我们试图了解他们已经完成的工作。
为什么要将canvas渲染器包装在一个匿名的自动调用函数中?我不能这样创建这个功能吗?
me.CanvasRenderer = me.CanvasRenderer || {};
me.CanvasRenderer = {
init: function() {
//...
甚至在名称空间内:
var CanvasStuff = {
CanvasRenderer : function() {
}
};
CanvasStuff.CanvasRenderer();
我不明白他们是如何制定这些代码和目的的。 (function () {
如何以及何时被调用?
以下是他们代码的片段:(link to full code)
(function () {
// The canvas renderer object
me.CanvasRenderer = (function () {
var api = {},
var canvas = null,
//...
api.init = function () {
//...
};
return api;
//...
})();
})();
答案 0 :(得分:2)
自动调用功能会立即执行,因此它与您发布的替代方案类似。
但是,自调用函数的优点是可以在该范围内声明在闭包之外无法访问的变量。例如,在您发布的代码段中,有一个var canvas
可以在任何api函数中访问,但任何外部代码都无法访问。在您建议的第一个替代方案中,如果api的任何客户端/呼叫者无法访问它,则无法声明canvas
。你的第二个备选方案(命名空间)不足以查看它的使用方式,因此你也可以将私有变量包装到该闭包中。