如何将块级作用域的JavaScript常量提升至全局并避免重复定义
解决JavaScript全局常量避免重复定义的问题
方法一:挂载到全局对象(浏览器环境)
直接将常量挂载到window对象上,通过判断window上是否存在对应属性来避免重复定义,同时用Object.defineProperty确保常量不可修改,完全模拟const的特性:
if (typeof window.A === 'undefined') { // 定义不可修改的全局常量 Object.defineProperty(window, 'A', { value: "A String", writable: false, enumerable: true, configurable: false }); Object.defineProperty(window, 'B', { value: "B String", writable: false, enumerable: true, configurable: false }); Object.defineProperty(window, 'C', { value: "C String", writable: false, enumerable: true, configurable: false }); Object.defineProperty(window, 'D', { value: "D String", writable: false, enumerable: true, configurable: false }); }
这样定义的常量属于全局作用域,且无法被修改,重复引入时会跳过定义逻辑,不会触发语法错误。
方法二:使用ES模块(推荐)
ES模块本身具备单例特性,同一个模块只会被加载执行一次,天然避免重复定义问题。
- 将常量封装成ES模块文件(比如
constants.js):
export const A = "A String"; export const B = "B String"; export const C = "C String"; export const D = "D String";
- 在HTML中以模块方式引入:
<script type="module" src="./constants.js"></script>
或者在其他JS模块中按需导入:
import { A, B, C, D } from './constants.js';
这种方式不需要额外的判断逻辑,符合现代JS模块化规范,同时能合理控制常量作用域。
方法三:简化的全局挂载(快速实现)
如果不需要严格模拟const的不可配置特性,也可以直接给window赋值,判断逻辑更简洁:
if (typeof window.A === 'undefined') { window.A = "A String"; window.B = "B String"; window.C = "C String"; window.D = "D String"; }
注意:这种方式下常量不会被重复定义,但如果有代码尝试修改window.A,非严格模式下不会触发语法错误(只是修改无效),严格模式下会报错。如需严格不可修改,推荐使用方法一。
内容的提问来源于stack exchange,提问作者CraigW
相关产品推荐
相关产品推荐

