javascript 揭示具有多个 files/modules 和全局变量的模块模式
javascript revealing module pattern with multiple files/modules and global vars
如果在其他地方有人问过这个问题,我深表歉意,但我看到的所有信息并不能真正帮助我理解答案和最佳实践。
我正在尝试为 javascript 使用揭示模块模式。我有一个基础 js 文件,其中包含应用程序每个页面所需的方法和属性。
然后每个页面都有自己的js文件,有自己独特的函数和变量,但也需要引用基础js文件中的变量。
我似乎真的误解了变量范围,或者我设置它的方式在某种程度上非常糟糕,因为我得到了令人困惑的结果。
问题:
- 如果我的结构有误,正确的方法是什么?
- 如何跨模块正确访问变量?
- 我在 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,
};
}());
如果在其他地方有人问过这个问题,我深表歉意,但我看到的所有信息并不能真正帮助我理解答案和最佳实践。
我正在尝试为 javascript 使用揭示模块模式。我有一个基础 js 文件,其中包含应用程序每个页面所需的方法和属性。
然后每个页面都有自己的js文件,有自己独特的函数和变量,但也需要引用基础js文件中的变量。
我似乎真的误解了变量范围,或者我设置它的方式在某种程度上非常糟糕,因为我得到了令人困惑的结果。
问题:
- 如果我的结构有误,正确的方法是什么?
- 如何跨模块正确访问变量?
- 我在 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,
};
}());