简而言之,我有一个模块,我想在页面上多次重用。在此模块中,我具有事件名称的全局常量。由于已经声明了常量,因此在第二次使用此模块的声明时会出现问题。但是,我无法将其移入if / else,因为范围界定将使该常数无法在其他地方使用。我该怎么办?
一些简单的代码可以解决我的问题
模块:
const THIS_IS_MY_EVENT = 'thisIsMyEvent';
// extra code down here
页面:(我使用树枝引擎来包含文件,但我认为它不相关)
<script src="/path/to/file.js">
<script src="/path/to/file.js">
在我的情况下,这种方法肯定无效:
if (typeof (THIS_IS_MY_EVENT) == undefined) {
const .... //this will limit the scope of my const
}
任何帮助将不胜感激。
答案 0 :(得分:2)
简而言之,我有一个模块,希望在页面上多次重用。
这听起来像是要解决的真正问题。而是一次导入该模块,两次使用其中的一个函数。通常,模块不应在导入时做任何事情(除了一些设置),只有在有要求时才进行。这样,模块的全局部分将运行一次,创建全局const
(但它不应该是全局的,而应该是从模块导出的const
),您将不会没有问题。
但是有条件地创建全局常量是一个有趣的问题。如果您确实需要全局变量,则可以使用Object.defineProperty
在window
和writable: false
上创建它。 (这并不完全相同。window
[global object]上的属性是全局变量,但是const
创建的全局变量没有的window
属性。不过,可能已经足够接近了。)
示例:
"use strict";
if (typeof THIS_DOESNT_EXIST === "undefined") {
Object.defineProperty(window, "THIS_DOESNT_EXIST", {
value: "foo",
writable: false, // false is the default
configurable: false, // these are just for emphasis,
enumerable: true // or false, your call
});
}
console.log(THIS_DOESNT_EXIST);
THIS_DOESNT_EXIST = 42;
console.log(THIS_DOESNT_EXIST);