在 JavaScript 中存储的全局范围内创建的常量在哪里?

Posted

技术标签:

【中文标题】在 JavaScript 中存储的全局范围内创建的常量在哪里?【英文标题】:Where are constants created in a global scope stored in JavaScript? 【发布时间】:2020-05-03 03:40:40 【问题描述】:

例如,如果我使用var var_example = '123' 创建一个变量,我可以通过window.var_example 访问它。

但是,如果我使用 const const_example = '456' 创建一个 const 变量,那么我该如何访问它?

我需要它来在函数中创建一个不可变/只读全局变量。 我可以使用window.in_function_var = 'global variable'在函数中创建一个普通的全局变量,但是我不知道如何在函数中创建一个常量/不可变/只读全局变量;在我看来,这可以通过访问带有常量的范围并在那里添加所需的变量来完成。

【问题讨论】:

关于如何访问const 变量 - 您可以照常进行;在其范围内按名称。这似乎是一个 X/Y 问题。您要解决的实际问题是什么? 【参考方案1】:

使用constlet 声明的变量未在窗口because the specification says so 上定义。


您可以使用Object.defineProperty() 将属性添加到窗口对象。这将默认设置writable: falseconfigurable: false

Object.defineProperty(window, "in_function_var", 
  value: 'global variable'
)

console.log(in_function_var)

in_function_var = "updated"
console.log(in_function_var)

delete window.in_function_var
console.log(in_function_var)

在严格模式下,如果您尝试更新或删除属性,则会引发错误:

"use strict"

Object.defineProperty(window, "global_var", 
  value: 'global variable'
)

try 
  global_var = "updated"
 catch (e) 
  console.error(e)


try 
  delete window.global_var
 catch (e) 
  console.error(e)

【讨论】:

谢谢,这两个答案都有很大帮助。我想澄清一下我是否可以用这种方法重新定义一个函数变量。当使用函数 example_var() 声明变量时,defineProperty 不能重新定义 example_var。 @sopafoy 只需将value 设置为该函数函数:Object.defineProperty(window, "example_var", value: function example_var() ... )【参考方案2】:

您可以尝试为 window 对象定义一个不可变属性。 但这与常数不同。无法更改,但尝试更改时不会出现相同的错误。

"use strict"
const CONST1 = 1;

function setGlobalConst() 
  Object.defineProperty(window, "CONST2", 
      enumerable: false,
      configurable: false,
      writable: false,
      value: 2
  );
;

setGlobalConst();

console.log("CONST1: " + CONST1);
console.log("CONST2: " + CONST2);

// no have error but not mutted
CONST2 = 3;
// error
CONST1 = 2;

【讨论】:

以上是关于在 JavaScript 中存储的全局范围内创建的常量在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

检查变量是不是设置在全局范围内?

JavaScript中的“闭包”

浅谈JavaScript闭包

使用webpack打包vue工程

全局局部变量,数据的存储类别

打字稿:如何在全局范围内进行一些导入?