可以在JavaScript中声明全局常量吗?

时间:2010-11-13 20:31:36

标签: javascript variables constants global-variables

如果是这样,这种声明的语法是什么?

9 个答案:

答案 0 :(得分:25)

正如“Pointy”如此仔细地注意到,ECMAscript没有这样的功能。但是,JavaScript does

const a = 7;
document.writeln("a is " + a + ".");

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

答案 1 :(得分:24)

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

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

<script>
  var EXACTLY_ONE = 1;

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

答案 2 :(得分:13)

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

也没有常数。您只需在没有var关键字的情况下声明它们。

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

window.GLOBAL_CONSTANT = "value";

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

答案 3 :(得分:5)

你可以使用getter和setter这样做:

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

如果您想要一般功能:

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);

答案 4 :(得分:3)

如果您想确保该值无法更改,请使用函数。

所以,而不是:

var Const_X=12

使用:

function Const_X() {
return 12;
}

答案 5 :(得分:3)

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

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

        这比尝试实现全局常量更简洁,特别是当您有多个JavaScript文件要使用常量时。

答案 6 :(得分:2)

该问题的直接答案是“否”。尽管ECMA / JS提供了一种轻松进行函数式编程的方法,但它确实会有所帮助。我用来解决此问题的可行方法是在全局范围内声明const并使用包装函数,请参见以下示例:

:)

global_var = 3; //This can change say inside a function etc. but once you decide to make 
                //this global variable into a constant by calling on a function
const make_variable_constant = function(variable)
{
    const constant = variable;
    return constant;
}

const const_global = make_variable_constant(global_var);

:)

当面向对象程序设计大肆宣传时,我班上的一个孩子告诉C讲师,C不是面向对象的,讲师说他甚至还没有想到Java和C ++之前就已经用C进行过面向对象编程。同样,您可以用Javascript进行函数式编程,但难度要大得多。就像在C ++中更容易进行面向对象的编程一样。

答案 7 :(得分:0)

记录下来。

// ES6+ code:
const CONSTGLOBAL1=200;  // it is a constant global

function somef() { 
   document.write(CONSTGLOBAL1); // CONSTGLOBAL1 is defined (because it's global)
   const CONSTLOCAL=200; // it's a local constant
   document.write(CONSTLOCAL); // CONSTLOCAL is defined
}       
somef();
document.write(CONSTLOCAL); // CONSTLOCALis NOT defined.

因此,如果常量在{}内定义,则它是局部的,否则它是全局的。

答案 8 :(得分:-1)

如果您不打算更改任何对象属性的值,可以使用 Object.freeze()

window.globalConst = Object.freeze( { x: 1, y: true } );

以下说明了 constObject.freeze() 之间的区别:

const x = Object.freeze({
  a: 1,
  b: 2
});

x.a = 3;

// x.a is still = 1
console.log("x.a = ", x.a);

const y = {
  a: 1,
  b: 2
};

y.a = 3;

// y.a has been changed to 3
console.log("y.a = ", y.a);