Tre*_*yen 5 javascript scope constants
简而言之,我有一个模块,我想在一个页面上多次重复使用。在这个模块中,我有一个事件名称的全局常量。问题发生在该模块的第二次使用的声明中,因为该常量已经被声明。但是,我无法将它移到 if/else 中,因为范围界定会使常量无法在其他地方使用。我该怎么办?
我的问题的一些简单代码:
模块:
const THIS_IS_MY_EVENT = 'thisIsMyEvent';
// extra code down here
Run Code Online (Sandbox Code Playgroud)
页面:(我使用树枝引擎来包含文件,但我认为它不相关)
<script src="/path/to/file.js">
<script src="/path/to/file.js">
Run Code Online (Sandbox Code Playgroud)
这肯定不会在我的情况下工作:
if (typeof (THIS_IS_MY_EVENT) == undefined) {
const .... //this will limit the scope of my const
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
简而言之,我有一个模块想在页面上多次重用。
这听起来像是真正需要解决的问题。相反,导入模块一次,使用其中的函数两次。模块通常不应该在导入时执行任何操作(除了一些设置之外),只有在稍后需要时才执行。这样,模块的全局部分将运行一次,创建全局const(但它不应该是全局的,它应该是const从模块导出的),并且您不会遇到问题。
但有条件地创建一个全局常量是一个有趣的问题。如果你确实想要一个全局的,你可以使用withObject.defineProperty创建它。(这并不完全相同。[全局对象]上的属性是全局变量,但创建的全局变量不是的属性。不过,可能已经足够接近了。)windowwritable: falsewindowconstwindow
例子:
"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);Run Code Online (Sandbox Code Playgroud)