Javascript 如何将全局常量重构为模块-JS最佳实践
我是JS新手——我目前的阅读表明,全局变量是一个巨大的危险信号,应该不惜一切代价避免。我目前正在进行一项重构挑战,我在.js文件中声明了一些数值,这些数值随后会在程序中的其他.js文件中调用。我不确定在这里使用什么样的最佳实践,从而消除任何代码气味 我有一些常量存储在一个文件中,Javascript 如何将全局常量重构为模块-JS最佳实践,javascript,jasmine,global-variables,refactoring,constants,Javascript,Jasmine,Global Variables,Refactoring,Constants,我是JS新手——我目前的阅读表明,全局变量是一个巨大的危险信号,应该不惜一切代价避免。我目前正在进行一项重构挑战,我在.js文件中声明了一些数值,这些数值随后会在程序中的其他.js文件中调用。我不确定在这里使用什么样的最佳实践,从而消除任何代码气味 我有一些常量存储在一个文件中,options.js。然后,这些常量将在其他几个文件中使用,如agedbrie.js和quality.js 所有这些文件都存储在一个文件夹中 就目前为止所采取的步骤而言,我考虑过在每个需要它们的函数中声明所需的变量,因此
options.js
。然后,这些常量将在其他几个文件中使用,如agedbrie.js
和quality.js
所有这些文件都存储在一个文件夹中
就目前为止所采取的步骤而言,我考虑过在每个需要它们的函数中声明所需的变量,因此(我认为)将它们从全局空间中移除。然而,这会导致大量的重复,并导致代码不遵循枯燥的原则
Options.js:
const MIN_SALE_DATE = 0
const MAX_QUALITY = 50
const MIN_QUALITY = 0
const SULFURAS_QUALITY = 80
在我的程序的其他文件中调用这些常量的示例:
Agedbrie.js
(function(exports){
//other code unrelated
}
AgedBrie.prototype.updateQuality = function () {
if (this.sellIn > MIN_SALE_DATE ){
quality.js:
//other code
function qualityMaximum(quality){
if (quality > MAX_QUALITY) {
quality = MAX_QUALITY
}
return quality
}
//further code
从本质上说,我有现在就可以工作的代码,并且通过了我编写的测试,但是我渴望尽早获得最佳实践,因此消除任何可能的全局变量是非常重要的。提前谢谢你
编辑
只是想澄清一下——这是一次尝试
我有一个可行的解决方案,只是它目前包含全局变量,我知道在最佳实践中,这些变量有点危险
编辑2
我自己设法纠正了这一点——如果有人通过谷歌来到这里,我就是这么做的:
options.js
var OPTIONS = (function() {
var private = {
"MIN_SALE_DATE" : 0,
"MAX_QUALITY" : 50,
"MIN_QUALITY" : 0,
"SULFURAS_QUALITY" : 80
};
return {
get: function(name) { return private[name]; }
};
})();
然后,为了在我的代码的其他地方调用这些变量:
OPTIONS.get("name here")
为了避免使任何东西全球化,您必须将所有脚本一起编译成一个,可能需要像Webpack这样的捆绑包。这是后端项目还是前端?抱歉,我应该更清楚;该项目是纯粹的重构-即镀金玫瑰-正如我所说,我有一个可行的解决方案,只是我担心可能的全局变量使用您的
var选项
仍在污染全局范围。为了避免这种情况,你必须将所有脚本放在一个文件中(可能是在前面提到的绑定器的帮助下),并使用iLife。为了避免使任何东西全球化,你必须将所有脚本编译到一个文件中,可能是使用像Webpack这样的绑定器。这是后端项目还是前端?抱歉,我应该更清楚;该项目是纯粹的重构-即镀金玫瑰-正如我所说,我有一个可行的解决方案,只是我担心可能的全局变量使用您的var选项
仍在污染全局范围。为了避免这种情况,您必须将所有脚本放在一个文件中(如前所述,可能需要bundler的帮助)并使用IIFE。