我有以下 JavaScript 代码
var globalConfiguration = null;
function loadFile(filePath) {
}
function onLoadPage() {
}
function getConfiguration() {
}
function process() {
}
我想使用 IIFE 将所有函数封装在一个闭包中,以避免混乱全局名称空间,所以我写道:
(function(window){
var globalConfiguration = null;
function loadFile(filePath) {
}
function onLoadPage() {
}
function getConfiguration() {
}
function process() {
}
});
但是,我不太理解这个概念,现在在我的 HTML 页面中我将如何调用我的函数
onLoadPage
?
如果不以某种方式将其放入全局命名空间中就不能。
我对这样构建代码的建议:
function ExampleHelper() {
(function(scope) {
scope.globalConfiguration = null;
scope.loadFile = function(filePath) {
};
scope.onLoadPage = function() {
};
scope.getConfiguration = function() {
};
scope.process = function() {
};
})(this);
}
var foo = new ExampleHelper(); // "foo" now contains all of your functions
foo.onLoadPage();
编辑 2024:现在使用类 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes 当这个答案最初发布时,这不可用/广泛支持
现在您已经封装了模块,您需要决定要向外界“暴露”什么内容。任何您想公开的内容,都可以导出。此外,您还需要决定要附加到什么context(在本例中为window
)。然后立即传递上下文(从而完成 IIFE)。
例如:
(function(window){
var exports = {};
var globalConfiguration = null;
function loadFile(filePath) {
}
function onLoadPage() {
}
function getConfiguration() {
}
function process() {
}
exports.getConfiguration = getConfiguration;
window.myModule = exports;
})(window);
附加到传入的
window
对象是以受控方式导出内容的一种方法。因此,您确实需要将上下文(在本例中为窗口)传递给 IIFE。也许,
window
不会永远成为通话的上下文。 运行此代码后,
myModule
将在全局范围内可用。
(function(window) {
var globalConfiguration = null;
window.onload = onLoadPage;
function loadFile(filePath) {}
function onLoadPage() {
alert('hello world');
}
function getConfiguration() {}
function process() {}
}(window));
查看这篇关于链接方法的文章
,它帮助我更好地理解链接。现在看看如何使用您在链中描述的方法。假设:(因为我不知道你为什么写这些方法,所以我做了一些假设)。
loadFile(filepath) - 返回一个文件对象
希望这有帮助。