我正在构建一个游戏,并试图弄清楚我正在使用的 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;
//...
})();
})();
最佳答案
自调用函数会立即执行,因此它与您发布的替代方案类似。
但是,自调用函数的优点是您可以在该范围内声明在闭包外部无法访问的变量。例如,在您发布的代码片段中,有一个 var canvas
可以在任何 api 函数中访问,但不能由任何外部代码访问。在您建议的第一个替代方案中,如果 API 的任何客户端/调用者都无法访问 Canvas ,则无法声明它。您的第二个替代方案(命名空间)没有填写得足够多,无法查看它将如何使用,因此您也可以将私有(private)变量包装到该闭包中。
关于javascript - 用自执行函数包装命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27452974/