javascript - jQuery 命名空间声明和模块化方法

标签 javascript jquery

我对如何继续我的项目感到困惑。 我正在开发一个企业应用程序,其中要编写很多模块。 大多数模块将使用大量 jQuery 插件来创建复杂的网格,为不同的目的绘制图形,这意味着模块将向 DOM 附加大量的 div、表格等。

我想保留命名空间,因为这将是一个大型应用程序。 为此,我遇到了原型(prototype)方法自执行匿名函数。 自执行匿名函数好像推荐的比较多。

我的问题是

  1. 自执行函数是否可重用?我的意思是这些函数会立即执行,所以假设一个模块为给定的 JSON 文件绘制了一个复杂的网格。那么我能否像 jQuery 插件一样对 3 个不同的 JSON 文件使用相同的自执行匿名函数?
  2. 当编写大量模块时,它们将在启动时自行执行。它会影响内存/处理器的使用吗?不应该是在需要时调用模块的方式吗? self 执行有什么意义?

我的项目范围:

请帮助我理解这个在我的项目范围内自执行的东西,这是我的项目拥有一个主命名空间说“Myapp”及其模块,如 Myapp.moduleA、Myapp.moduleB.MyApp 将在点击等时触发其模块。 什么是最适合我的方式?

自执行匿名函数

(function( skillet, $, undefined ) {
    //Private Property
    var isHot = true;

    //Public Property
    skillet.somevar = "Bacon Strips";

    //Public Method
    skillet.draw = function() {
        //Draw a grid
    };

    //Private Method
    function _grid(  ) {
        //
        }
    }   
}( window.skillet = window.skillet || {}, jQuery ));

最佳答案

您不能重用自执行函数,它只会立即执行,仅此而已。

如果你需要多次执行它,你应该只声明一个函数。

一种可能的方法是这样的:

var MYNAMESPACE.Object = (function(){
    // private methods
    var somemethod = function(){};

    // public methods
    return {
         somepublicmethod: function(){}
    };
})();

现在你可以这样调用它:

MYNAMESPACE.Object.somepublicmethod();

至于启动时执行。如果您只创建方法并且不在声明中立即执行任何操作,那么它不会对性能产生太大影响,除非您有大量模块。如果是这种情况,您可能应该研究异步模块加载器模式 (AMD)。 RequireJS 就是一个很好的例子:http://requirejs.org

我写了一篇关于 JS 命名空间的文章,您可能会感兴趣:

http://www.kenneth-truyers.net/2013/04/27/javascript-namespaces-and-modules/

关于javascript - jQuery 命名空间声明和模块化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20383949/

相关文章:

javascript - Safari 扩展注入(inject)脚本/网页交互

javascript - 尝试将 EmailJS 与 React 一起使用时服务 ID 无效

javascript - jQuery 动画垂直滚动到一个元素和水平滚动到不同的元素同时从单个哈希标记/变量

javascript - 这个用于编辑图像的 javascript 弹出框在 firefox 和 chrome 中有效,但在 Internet explorer 中不显示弹出框

javascript - popstate - 需要在后退按钮上点击两次才能真正返回

javascript - 在不刷新页面的情况下提交 php 表单

javascript - 网络音频,createMediaElementSource 变量源

javascript - 如何按三个不同的字段对 javascript 数组进行排序?

javascript - 如何使用 Ajax 检查登录情况?

jquery - jQuery中slideDown()和slideUp()效果的问题