Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javascript分解成模块,我这样做对吗?_Javascript_Jquery - Fatal编程技术网

将javascript分解成模块,我这样做对吗?

将javascript分解成模块,我这样做对吗?,javascript,jquery,Javascript,Jquery,我使用的是javascript模块模式,到目前为止: var APP; if(APP == undefined) { APP = {}; } APP = (function() { var userId = -1; var privateVar = ''; var _init = function($userId) { userId = $userId; }; var _publicMethod = function($id){

我使用的是javascript模块模式,到目前为止:

var APP;
if(APP == undefined) {
  APP = {};
}

APP = (function() {
    var userId = -1;
    var privateVar = '';

    var _init = function($userId) {
       userId = $userId;
    };
    var _publicMethod = function($id){
        privateVar = id;
    };
    return {
        init = function($userId) {
             _init($userId);
         },
        publicMethod = function($id) {
           _publicMethod($id);
        }
    };
})();
然后我有一个通用的utils模块:

APP.utils = (function(){

})();
然后每个页面我都计划有一个模块,所以我不会无缘无故地在这些DOM元素不存在的页面上连接事件(按钮点击等):

APP.homePage = (function(){
     return {

     };
})();
因此,每个模块都有一个init()方法,我将在页面上调用该方法来运行必须运行的东西(例如,连接事件、设置变量,如say userId等):

$(文档).ready(函数(){
APP.init();
APP.homePage.init(“abc”);
});
所以现在如果文件太大,我也可以把它们分成单独的文件

  • 如果一个模块需要调用另一个模块,我想唯一可行的方法就是通过公共api来实现,对吗? e、 g.如果主页需要userId,我应该在主页#init方法中传递它吗

  • 我的编码风格如何,任何明显的风格都不被认为是最佳实践

  • 对这种方法有何评论?一般来说好吗

  • 在我看来,模块模式是组织代码的一种非常好的方式。回答您的问题:

    1) 是的,您的模块只能访问在其返回的对象中公开的其他模块的方法和属性

    2) 我觉得你的编码风格看起来不错。我会做出以下改变:

    APP = (function() {
        var _userId = -1;
        var _privateVar = '';
    
        var init = function($userId) {
           _userId = $userId;
        };
        var publicMethod = function($id){
            _privateVar = id;
        };
        return {
            init : init,
            publicMethod : _publicMethod
        };
    })();
    
    首先,下划线通常表示“私有”属性或方法。第二,您可以去掉返回对象中的额外函数,直接指向您关心的方法或属性。这通常被称为“显示模块模式”,因为即使是公共方法也没有在返回的对象中定义——它们只是被引用

    3) 这种方法绝对是封装代码的好方法。您获得了私有和特权方法的好处,并且通常会得到更好的API,因为您只公开需要公开的内容


    做得好。

    在我看来,模块模式是组织代码的一种非常好的方式。回答您的问题:

    1) 是的,您的模块只能访问在其返回的对象中公开的其他模块的方法和属性

    2) 我觉得你的编码风格看起来不错。我会做出以下改变:

    APP = (function() {
        var _userId = -1;
        var _privateVar = '';
    
        var init = function($userId) {
           _userId = $userId;
        };
        var publicMethod = function($id){
            _privateVar = id;
        };
        return {
            init : init,
            publicMethod : _publicMethod
        };
    })();
    
    首先,下划线通常表示“私有”属性或方法。第二,您可以去掉返回对象中的额外函数,直接指向您关心的方法或属性。这通常被称为“显示模块模式”,因为即使是公共方法也没有在返回的对象中定义——它们只是被引用

    3) 这种方法绝对是封装代码的好方法。您获得了私有和特权方法的好处,并且通常会得到更好的API,因为您只公开需要公开的内容

    干得好

    如果一个模块需要调用另一个模块,我想唯一可行的方法就是通过公共api来实现,对吗

    e、 g.如果主页需要userId,我应该在主页#init方法中传递它吗

    不。我不会在所有模块中重复
    userId
    代码,而是在默认模块中为其提供一个公共getter

    对编码有什么意见吗

    此代码

    var APP;
    if(APP == undefined) {
      APP = {};
    }
    
    APP = ...
    
    这是毫无用处的。您不需要在此处检查对象是否存在,因为您无论如何都会覆盖它。这也意味着此代码必须首先执行。如果要使模块独立于加载顺序,则需要使用

    var APP = (function(a) {
        var private_vars; // ...
        a.init = ...
        a.publicMethod = ... // add them to the object instead of creating new one
        a.getPrivate = function() {
            return private_vars;
        };
        return a;
    })(APP || {}); // create one iff not already existing
    
    // other file:
    var APP = APP || {};
    APP.utils = ... // add object to namespace
    
    代码

    var _publicMethod = function($id){
        privateVar = id;
    };
    
    看起来有点奇怪。首先,下划线通常表示对象的半私有(公共但不使用)属性,不应用于变量名。这里的情况并非如此,因为函数将作为
    APP
    的“publicmethod”属性公开。如果需要,请在此处使用下划线。其次,这里不需要使用函数表达式。代码位于模块的本地作用域中,使用函数声明可以使其在该作用域中的任何地方都可用,并允许命名函数。你应该使用

    function publicMethod($id) {
        privateVar = id;
    }
    a.publicMethod = publicMethod;
    
    如果一个模块需要调用另一个模块,我想唯一可行的方法就是通过公共api来实现,对吗

    e、 g.如果主页需要userId,我应该在主页#init方法中传递它吗

    不。我不会在所有模块中重复
    userId
    代码,而是在默认模块中为其提供一个公共getter

    对编码有什么意见吗

    此代码

    var APP;
    if(APP == undefined) {
      APP = {};
    }
    
    APP = ...
    
    这是毫无用处的。您不需要在此处检查对象是否存在,因为您无论如何都会覆盖它。这也意味着此代码必须首先执行。如果要使模块独立于加载顺序,则需要使用

    var APP = (function(a) {
        var private_vars; // ...
        a.init = ...
        a.publicMethod = ... // add them to the object instead of creating new one
        a.getPrivate = function() {
            return private_vars;
        };
        return a;
    })(APP || {}); // create one iff not already existing
    
    // other file:
    var APP = APP || {};
    APP.utils = ... // add object to namespace
    
    代码

    var _publicMethod = function($id){
        privateVar = id;
    };
    
    看起来有点奇怪。首先,下划线通常表示对象的半私有(公共但不使用)属性,不应用于变量名。这里的情况并非如此,因为函数将作为
    APP
    的“publicmethod”属性公开。如果需要,请在此处使用下划线。其次,这里不需要使用函数表达式。代码位于模块的本地作用域中,使用函数声明可以使其在该作用域中的任何地方都可用,并允许命名函数。你应该使用

    function publicMethod($id) {
        privateVar = id;
    }
    a.publicMethod = publicMethod;
    

    您还应该看看require.js。这可能是一个问题,因为您也应该看看require.js。这可能是一个问题,因为您能否给出一个在默认模块中公开公共属性的示例,我只添加了一些方法,因此希望确保我做得正确谢谢!请参阅带有变量的示例。公共属性添加到闭包内部的模块中