【问题标题】:How to create a non block-scoped constant in js?如何在 js 中创建一个非块范围的常量?
【发布时间】:2018-07-09 23:15:06
【问题描述】:

const 创建一个块范围的常量。但是你如何创建一个非块范围的常量呢?在 Java 中,这通过 final 关键字起作用。

您不能总是在您想要的级别上定义const。我说的是全局范围内的常量。

【问题讨论】:

  • non-block-scoped 是什么意思?你希望它的范围是什么?只需在该级别定义 const 即可
  • 你不能总是在你想要的级别上定义一个常量。我也在谈论一个全局范围内的常量。例如。 const a = "constant"; this.a;//undefined
  • 查看您评论中的代码示例,您似乎有些误解了 JS 中的作用域。 constlet 声明作用域常量/变量(想想 private),它们不会在 this 上创建属性。 JS 中的this 取决于执行上下文,它几乎只是一个与声明的常量/变量没有联系的数据对象。
  • 我在这里没有理解任何错误。我的代码示例的要点是,在最高级别定义 const 仍不会在全局对象上创建属性,因此它与 var 关键字不同。我同意,我应该使用 window 而不是 this,但它们在示例的上下文中指的是同一个对象。

标签: javascript scope constants


【解决方案1】:

您可以使用Object.defineProperty 执行此操作,如下所示:

Object.defineProperty(window, "myVariable", {value: "initial value", writeable: false});
console.log(myVariable);

// Note that trying to change it doesn't work
myVariable = "something else";
console.log(myVariable);

【讨论】:

  • 为什么投反对票?这是解决问题的唯一答案 - 一个超出其范围的常量变量
  • 我认为这是因为对象属性描述符不是 OP 所要求的。对于这个问题来说,这是一个矫枉过正的问题。可能OP还不了解js来引入这样的更高级的概念。 OP 它正在尝试了解作用域的工作原理。
  • @NelsonTeixeira 这是 OP 正在寻找的解决方案。他真正想要的是全局对象上的不可变属性,他只是没有这样表达,因为他没有完全理解 JS 中的作用域和上下文是什么,并且似乎从 Java 的角度来看
  • 您的问题有 2 个反对票和 1 个赞成票。一票否决是我的。由于 OP 选择您的答案是正确的,现在我认为我的反对意见是不公平的。但是正如我昨天投反对票一样,除非问题被编辑,否则反对票现在被锁定。如果您愿意,请在您的答案中添加一些版本,我将删除反对票。
【解决方案2】:

可以通过以下几种方式定义变量:

  1. var:作用域要么是全局的,要么包含在声明它的函数中。变量可以随意重新分配。
  2. let:范围仅限于声明它的块 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let)。变量的值可以在范围内随意重新赋值。在块范围之外具有相同名称的变量被视为不同的变量。 不要这样做。它会混淆你的代码。
  3. const:与let 相同的限制,除了一旦分配变量就不能重新分配。
  4. 函数参数:(a, b, c) => {}var 基本相同,不同之处在于它们是在受限于其范围的函数中定义的。

因此,如果您想要一个存在于更高范围的常量,只需在更高级别声明它即可。例如:

// declare it here
const color = '#cc0000';
const fn = () => {
  // instead of declaring the const here. In here, it will be limited to the scope of the function
}

【讨论】:

  • 我想要的是像const 这样没有let 限制的东西。在最高级别定义它并不会使其与 var 相同,因为它不是全局对象 const a = '#ddd'; this.a;//undefined 的属性
  • 我认为您仍然对 javascript 中的范围感到困惑。全局对象将是 window 对于浏览器和 global 对于 node.js。您评论中的代码示例没有任何意义。
  • 表示a不是全局对象的属性。我假设this == window。所以即使你在最高层声明了一个 const,它也不等同于一个只读变量
  • this 可以并且通常指代window 对象。
  • 不是const 在全局对象上创建一个属性。我说它没有。我说过(第一条评论)在最高级别定义const 不会使其与var 相同,因为const 不会在全局对象上创建属性(与var 不同)。代码示例的要点是 const 不会在全局对象上创建属性。该示例中的this 指的是全局对象,因为该示例假设代码处于最高级别。
【解决方案3】:

javascript 中的作用域基本上是由对象、函数或 () 定义的。

顶级范围是窗口对象。如果你把它放在任何函数之外,它就会在那里。

因此,如果您想要一个非阻塞范围,只需在任何函数、对象等之外定义它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2012-03-05
    • 2022-07-26
    相关资源
    最近更新 更多