如何从Javascript函数内部定义全局常量?
我正在构建一个由一组模块组成的应用程序,这些模块在应用程序引导时加载:如何从Javascript函数内部定义全局常量?,javascript,constants,Javascript,Constants,我正在构建一个由一组模块组成的应用程序,这些模块在应用程序引导时加载: const MODULES = [] function registerModules(config) { return modules.map(module => (new module(config)).install()); } function bootstrap() { MODULES = registerModules({...}); } 当然,上述情况会引起错误。我想做的是只在应用程序启动
const MODULES = []
function registerModules(config) {
return modules.map(module => (new module(config)).install());
}
function bootstrap() {
MODULES = registerModules({...});
}
当然,上述情况会引起错误。我想做的是只在应用程序启动时分配模块常量,然后它应该被修复。这可能吗
模块的初始化必须在引导程序内部进行,因为我必须将配置变量传递给RegisterModule。如果确实需要:
在尚未调用引导期间,具有初始化但为空的模块阵列,以及
使模块在填充后不可变,以及
保持RegisterModule的当前函数签名不变;
然后,您可以按如下方式进行操作:
function bootstrap() {
Object.freeze(Object.assign(MODULES, registerModules({...})));
// OR:
// MODULES.push(...registerModules({...}));
// Object.freeze(MODULES);
}
const globals = {};
function bootstrap() {
globals.MODULES = registerModules({...});
Object.freeze(globals.MODULES);
}
如果在调用bootstrap之前您不坚持模块的存在,并且您愿意将该信息存储在对象中,那么您可以按如下方式进行操作:
function bootstrap() {
Object.freeze(Object.assign(MODULES, registerModules({...})));
// OR:
// MODULES.push(...registerModules({...}));
// Object.freeze(MODULES);
}
const globals = {};
function bootstrap() {
globals.MODULES = registerModules({...});
Object.freeze(globals.MODULES);
}
一旦您对globals满意,您还可以冻结该对象:
Object.freeze(globals);
完整地说,还可以冻结单个模块,而不仅仅是模块变量。。。虽然OP没有提到单个模块是否也应该被修复。谢谢,这似乎是目前唯一可用的选项,虽然它只能确保不变性,但仍然可以完全重新分配。@adnanmuttaleb,你能解释一下完全重新分配是什么意思吗?一旦引导程序执行,模块=、模块[0]=都不会工作…@trincot我的意思是模块=,因为模块[0]=意味着对象是可变的。模块=甚至不会在原始代码中工作,因为常量?这就是我建议Object.assign/.push的原因。。。。。。