javascript - 用自执行函数包装命名空间

标签 javascript

我正在构建一个游戏,并试图弄清楚我正在使用的 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/

相关文章:

javascript - 带有文本和图像的工具提示 (javascript/css/html)

javascript - 表对列进行水平排序

Javascript 正则表达式匹配文字\\n

javascript - 从标签中选择随机单词,用斜体括起来

javascript - 通过 node.js 和 socket.io 在两个用户之间发送消息

javascript - 如何检查一个元素是否有特定的子元素?

javascript - Angular Material 设计有效/无效输入

javascript - 如何在不使用按钮或 tbody 的情况下单击动态生成的表中的一行来获取 HTML 表中单元格的值

javascript - 如果 div 中的数字 = 0,则隐藏该数字

javascript - 单击颜色更改和图形尺寸 [JS]