【问题标题】:How to declare CONST when it doesn't exist in JavascriptJavascript中不存在时如何声明CONST
【发布时间】:2018-10-15 06:33:53
【问题描述】:

简而言之,我有一个模块,我想在一个页面上多次重复使用它。在这个模块中,我有一个事件名称的全局常量。问题出现在声明此模块的第二次使用时,因为已经声明了常量。但是,我不能将它移到 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 存储在常量文件中并将其导入您喜欢的每个模块中怎么样?
  • @YarinDekel 这有什么不同?由于您要导入模块两次,因此您仍然需要将常量文件两次导入页面。我在您的情况下看到的解决方法是在 1 个文件中设置所有常量并将其直接导入页面本身。但这有点乱,恕我直言
  • @TreeNguyen 您可能误解了导入的工作原理。模块被缓存,内部代码只运行一次。
  • 或者只使用 var, ;-)
  • 是的,它完全违背了 const 的目的,在您实现 T.J.克劳德的回答。

标签: javascript scope constants


【解决方案1】:

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

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

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

【讨论】:

  • 我真的需要它去全局,因为我使用这个常量来触发事件并收听它。
  • @TreeNguyen - 这不符合。如果您正确使用模块,则不需要任何全局变量。
  • 嗨,正如我在上面的评论中提到的那样。我相信我的术语确实是错误的。就我而言,模块 = 一段可重用的代码。它在任何意义上都不是一个类,也没有导入或导出。通过使用 twig,它基本上是将文件复制粘贴到文件中。所以我写的“模块”在同一个页面中插入了两次。而且在他们两个中,代码都有些不同。
  • @TreeNguyen - 在您的问题中,您显示加载 same 文件两次,因此代码不能不同。如果您真的要加载两个可能创建相同常量的单独文件,请不要。相反,有一个文件来创建您只加载一次的常量(在其他文件中的一个[或两个]之前)。或者退后一步,切换到使用适当的模块;这些问题就是创建模块的原因。
  • 你是对的。在向您说明问题后,我确实意识到问题很混乱,并且没有任何解决方案可以清理混乱。我会退后一步,寻找更合适的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2021-12-17
  • 2020-05-09
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多