Ken*_*Ken 28

由于"尖尖"如此仔细地注意到,ECMAscript没有这样的功能.但是,JavaScript确实:

const a = 7;
document.writeln("a is " + a + ".");
Run Code Online (Sandbox Code Playgroud)

当然,如果您正在编写代码以便在Web上运行Web浏览器,那么这可能对您没有多大帮助.:-)

  • @Tim,被一个不知道ECMAScript和JavaScript(tm)之间差异的人投票......,+ 1也来自我... BTW要记住的一件事是,TC39委员会已批准一组[实现者的建议](http://j.mp/agMtti),其中包括对非标准声明的限制 - 对于严格模式代码的`const`-.目前Firefox 4对严格模式下的非标准声明没有限制,但WebKit的JavaScriptCore有它们 - IMO-非常好,你不能在`Blocks`中使用`const`或者`FunctionDeclarations` ......要牢记.. (6认同)
  • 为什么这个被贬低?如果您在仅限Mozilla的环境中工作,这是真的,不是众所周知且有用的.来自我的+1. (5认同)

Poi*_*nty 27

Javascript实际上没有命名常量的概念,也没有对象的不可变属性.(请注意,我不是在谈论ES5.)

您可以var在全局范围内使用简单声明声明全局变量,例如网页包含的脚本中的任何函数外部:

<script>
  var EXACTLY_ONE = 1;
Run Code Online (Sandbox Code Playgroud)

那么你的代码当然可以使用那个常量,虽然它不是真正的"常量",因为值可以改变(换句话说,属性更新).

  • 更新 - 大多数现代浏览器中提供的const关键字和ES6 Harmony中的标准:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const (7认同)
  • 请阅读文档!const 仅限于范围,因此类似: `if(DEBUG){const HOST = "locahost";} else { const HOST = "coolhost";}` 不会在全局范围内公开 `HOST`。 (2认同)

Jos*_*h K 13

除非使用var关键字声明,否则一切都是全局的.

也没有常数.你可以简单地声明它们没有var关键字.

如果要确保全局范围,可以将其放入window对象:

window.GLOBAL_CONSTANT = "value";
Run Code Online (Sandbox Code Playgroud)

您可以在任何范围内执行此操作.然后可以在函数或闭包内声明常量,但我不建议这样做.

  • 你可能想编辑一下严格模式,其他环境(比如nodejs,它使用 ```global``` 而不是 ```window```), ```new Function("return this")( )```` 和 ```globalThis``` (2认同)

koj*_*ow7 10

如果您只关心支持较新的浏览器(或使用 Babel 等转译器来支持较旧的浏览器),您可以执行以下操作:

  1. 使用您想要的任何常量创建一个 settings.js 文件并导出它们:
export const FRUIT = "kiwi";
export const VEGETABLE = "carrot";
Run Code Online (Sandbox Code Playgroud)
  1. 在您想要使用它们的文件中,您可以按如下方式导入它们:
import * as Settings from './settings.js'
Run Code Online (Sandbox Code Playgroud)
  1. 然后使用常量做这样的事情:
console.log("The unchangeable fruit is " + Settings.FRUIT);
Run Code Online (Sandbox Code Playgroud)

与尝试实现全局常量相比,这是一种更简洁的方法,尤其是当您有多个要在其中使用常量的 JavaScript 文件时。


Stu*_*ffe 7

你可以用getter和setter这样做:

Object.defineProperty(window, 'TAU', { 
    get: function(){return Math.PI*2;}
});
Run Code Online (Sandbox Code Playgroud)

如果您想要一般功能来执行此操作:

function define(name, value){
    Object.defineProperty(window, name, { 
       get: function(){return value;},
       set: function(){throw(name+' is a constant and cannot be redeclared.');},
    });
}

// Example use
define('TAU', Math.PI*2);
Run Code Online (Sandbox Code Playgroud)

  • +1用于使用getter和setter(这应该允许不在全局范围内的代码定义常量全局变量)。你可能想编辑一下严格模式,其他环境(比如nodejs,它使用 ```global``` 而不是 ```window```), ```new Function("return this")( )```` 和 ```globalThis```。 (3认同)