javascript 揭示具有多个 files/modules 和全局变量的模块模式

javascript revealing module pattern with multiple files/modules and global vars

如果在其他地方有人问过这个问题,我深表歉意,但我看到的所有信息并不能真正帮助我理解答案和最佳实践。

我正在尝试为 javascript 使用揭示模块模式。我有一个基础 js 文件,其中包含应用程序每个页面所需的方法和属性。

然后每个页面都有自己的js文件,有自己独特的函数和变量,但也需要引用基础js文件中的变量。

我似乎真的误解了变量范围,或者我设置它的方式在某种程度上非常糟糕,因为我得到了令人困惑的结果。

问题:

  1. 如果我的结构有误,正确的方法是什么?
  2. 如何跨模块正确访问变量?
  3. 我在 doc ready 上初始化模块是否正确?

我现在正在做的是:

var base = (function() {
    init = function() {
        url = $(location).attr('href');
        url = url.substr(-1) === '/' ? url.slice(0, -1) : url;

       segments = url.split('/');

        baseUrl = this.segments[0] + '//' + this.segments[2] + '/';

        resource = this.segments[3];

        this.segments = segments; //need access to this across all pages
        this.resource = resource;  //need access to this across all pages
        this.baseUrl = baseUrl;  //need access to this across all pages
    }
}

    doStuffGlobally = function() {
        //do stuff for all pages
    }

   return {
        init: init,
        baseUrl: this.baseUrl,
        segments: this.segments,
        resource: this.resource
  };
}());
$(document).ready(function() {
    base.init();
}

我在另一个页面上这样做:

var otherPage = (function() {
    init = function() {
      //do otherPage stuff;
    }
}
doStuff = function() {
    base.doStuffGlobally(); //need to access this.
    console.log(base.segments); //need to access this.
}

   return {
        init: init
  };
}());
$(document).ready(function() {
    otherPage.init();
}

您的 base 模块不需要 init 方法,它不需要等待 domready 但可以(并且应该)立即 运行。所以写

var base = (function() {
    var url = $(location).attr('href');
    if (url.substr(-1) === '/') url = url.slice(0, -1);

    var segments = url.split('/');
    var baseUrl = this.segments[0] + '//' + this.segments[2] + '/';

    var resource = this.segments[3];

    function doStuffGlobally() {
        //do stuff for all pages
    }

    return {
        baseUrl,
        segments,
        resource,
        doStuffGlobal,
    };
}());