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

问题描述 投票:0回答:2

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

如有任何帮助,我们将不胜感激。

javascript scope constants
2个回答
3
投票

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

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

我知道这是一篇旧帖子,但这也是一个可能的选择。

0
投票
// 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... })();


© www.soinside.com 2019 - 2024. All rights reserved.