当 Javascript 中不存在时如何声明 CONST

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)

任何帮助,将不胜感激。

T.J*_*der 3

简而言之,我有一个模块想在页面上多次重用。

这听起来像是真正需要解决的问题。相反,导入模块一次,使用其中的函数两次。模块通常不应该在导入时执行任何操作(除了一些设置之外),只有在稍后需要时才执行。这样,模块的全局部分将运行一次,创建全局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)

  • @TreeNguyen - 这不符合。如果正确使用模块,则不需要**任何**全局变量。 (2认同)