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

时间:2018-10-15 06:33:53

标签: javascript scope const

简而言之,我有一个模块,我想在页面上多次重用。在此模块中,我具有事件名称的全局常量。由于已经声明了常量,因此在第二次使用此模块的声明时会出现问题。但是,我无法将其移入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
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

  

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

这听起来像是要解决的真正问题。而是一次导入该模块,两次使用其中的一个函数。通常,模块不应在导入时任何事情(除了一些设置),只有在有要求时才进行。这样,模块的全局部分将运行一次,创建全局const(但它不应该是全局的,而应该是从模块导出的const),您将不会没有问题。

但是有条件地创建全局常量是一个有趣的问题。如果您确实需要全局变量,则可以使用Object.definePropertywindowwritable: 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);