【问题标题】:is it possible to define a global constant variable from inside a function in javascript?是否可以从 javascript 中的函数内部定义全局常量变量?
【发布时间】:2021-01-20 18:47:51
【问题描述】:

我想做这样的事情:

function defineGlobalConst(){
     const s = 10;
}

但我想从代码中的任何位置访问变量 s,因为我没有输入“const”

【问题讨论】:

  • window.s = 10?
  • @Terry that won't make s constant

标签: javascript


【解决方案1】:

你可以像这样定义一个全局变量

在浏览器中:

function defineGlobalConst(){
     window.s = 10;
}

在节点中:

function defineGlobalConst(){
     global.s = 10;
}

如果你希望它是一个常量,你可以使用 defineProperty 和一个 getter:

Object.defineProperty(window, "s", { 
  get: () => 10,
  set: () => { throw TypeError('Assignment to constant variable.') },
});

【讨论】:

  • 我正在使用浏览器,我希望它保持不变,所以据我了解:我不应该使用 windows.s = 10,因为它不会保持不变,我应该使用 defineProperty? set: () ... 是什么意思? get: ().. 如我所见,赋予 s 价值
  • 它在窗口对象中创建一个属性,带有一个getter和setter。 getter 正在返回值,但 setter 抛出错误。因此,如果您尝试通过运行s = 20 来更改 s 的值,它将不起作用,而是会引发错误。
  • 如果你需要一个非原始的值怎么办?对于这个确切的例子,它可以工作,但如果你需要一个对象或数组(通过引用传递的东西),这不起作用。专门谈论Object.defineProperty,因为get 将返回您在其中定义的任何内容,如果您尝试更改它的属性,它的行为将不像普通的JS“常量”。
  • @Sam,JavaScript 中没有任何内容是通过引用传递的。 Everything is passed by value.
  • @Sam 这适用​​于数组和对象,你有没有具体的例子吗?
【解决方案2】:

您唯一的选择是将值存储在窗口中。 请确保至少为您的值命名,因为它可能与窗口中已有的其他内容冲突:

// Create the namespace at the beginning of your program.
if (!window.MY_APP) {
  window.MY_APP = {};
}

window.MY_APP.s = 10;

【讨论】:

    【解决方案3】:

    可以通过使用反模式来解决您的问题。请注意,我不提倡这种方法,但从纯粹的“你能做到”的角度来看,在函数中分配的任何未声明的变量默认情况下都会变成全局(当然这不会像你一样创建一个常量'已经问过了,但我想我还是会展示它):

    function foo(){
      bar = "baz";   // implicit Global;
    }
    
    foo();
    
    
    // Show that "bar" was, in fact added to "window"
    console.log(window.bar);  // "baz"
    console.log(bar);  // "baz"

    【讨论】:

    • 当您可以创建显式全局时,为什么还要依赖隐式全局?这不是一个好的解决方案或好的建议,没有人应该这样编写代码。大多数样式指南都禁止这样做,大多数 linter 对此发出警告,大多数开发人员会在代码审查中将此称为错误。
    • @meagar 因此,显然您没有费心阅读我的回答(作为版主,我认为您会在否决投票或评论之前阅读)。我很清楚,我只是将它作为信息发布给那些可能不知道这就是发生的事情并且我不提倡这种方法的人。我没有将其作为“建议”提供,而是将其称为反模式。
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多