我在许多项目中都看到过这样的事情。服务器生成带有<script>
标记的html页面,以及其中的JS代码,它使用模板定义了一些&#34;常量&#34;。
例如。
<script>
window.CONSTANTS = {};
window.CONSTANTS.USER_ID = "<?= getUserId() ?>";
window.CONSTANTS.BASE_PATH = "<?= getBasePath() ?>";
</script>
我能想到的另一种方式是让客户进行ajax调用,以获取所有必要的数据。
答案 0 :(得分:2)
将变量分配给全局命名空间(在浏览器的情况下,&#34; window。[somevariable]&#34;)被认为是危险/邪恶/无论如何。
你应该总是,作为他们所称的&#34;良好做法&#34;,命名你的东西。假设您的应用程序名为Jumpr(为了给它一个时髦的时髦名称),您可以考虑在全局变量&#34; Jumpr&#34;。
下使用属于您的应用程序的命名空间变量和模块。对于常量,我个人喜欢将常量赋给app.CONSTANTS命名空间:
Jumpr.CONSTANTS
至于从服务器动态输出常量,这在我看来并不坏(保持与应用程序常量同步共享的服务器常量),您可以选择通过常量脚本文件导入它们,然后导入您的命名空间,如下所示:
Constants.js(此文件可以在请求时自动生成):
var Jumpr = Jumpr || {};
Jumpr.CONSTANTS = {
SOMECONST: "Some Constant Value 0"
SOMECONST1: "Some Constant Value 1"
}
...等。但这只是一种做法。如果您不熟悉此模式,那么它所做的就是检查已定义的Jumpr模块。如果没有定义,它会创建一个新对象。否则,它使用现有的和&#34;扩展&#34;它使用定义的常量。
另请注意,这些不是真正的常数。要在JS中实现常量的错觉,你需要创建一个get / set闭包,然后它将作为一个只读的检索器,但我不打算在这里进行。
<强> 修改 强> 由于问题的背景已经改变,我将更新我的答案:
在我看来,不,动态生成常量也不错。我认为,这些常量是从你的后端常量生成的。您可能希望这些环境保持同步(您可以捕获从服务器路由,表单名称到其他任何内容的所有内容)。我个人认为这可能是一件好事。
我想提醒一下,你认为这样做会让你的表现受到打击。我宁愿建议您引用常量文件/模块,然后每次服务器端的常量更改时都会更新。它会降低生成页面所需的计算能力并且值得付出努力,因为它通常很容易设置它,并且常量很少改变(关键词:它们不变):)
请注意,这正是我上面已经推荐的内容。
答案 1 :(得分:-2)
这是一种不好的做法。全局变量和函数可以被其他脚本覆盖。 Here有一个很好的例子。