简而言之,我有一个模块想在页面上多次重用。在这个模块中,我有一个事件名称的全局常量。由于常量已经被声明,因此在第二次使用该模块时会出现问题。但是,我无法将其移至 if/else 中,因为范围界定将使常量无法在其他地方使用。我该怎么办?
解决我的问题的一些简单代码:
模块:
const THIS_IS_MY_EVENT = 'thisIsMyEvent';
// extra code down here
页面:(我使用twig引擎来包含文件,但我认为它不相关)
<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
}
如有任何帮助,我们将不胜感激。
简而言之,我有一个模块想要在页面上多次重用。
这听起来是真正需要解决的问题。相反,导入模块一次,使用其中的函数两次。模块通常不应该在导入时“做”任何事情(除了一些设置之外),只有在稍后需要时才这样做。这样,模块的全局部分将运行一次,创建全局 const
(但它不应该是全局的,它应该是从模块导出的
const
),并且您不会遇到问题.但是有条件地创建全局常量是一个有趣的问题。如果你确实想要一个全局的,你可以使用
Object.defineProperty
在
window
上用 writable: false
创建它。 (这并不完全相同。 window
[全局对象] 上的属性是全局变量,但是 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);
我知道这是一篇旧帖子,但这也是一个可能的选择。
// THIS_IS_MY_EVENT may/may not be defined in global scope as const elsewhere
// in_your_file.js
(function () {
var THIS_IS_MY_EVENT = THIS_IS_MY_EVENT;
if (typeof THIS_IS_MY_EVENT === 'undefined') {
THIS_IS_MY_EVENT = 42;
}
// rest of code for the file here...
})();