关于变量:可以用JavaScript声明全局常量吗?

Can global constants be declared in JavaScript?

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


JavaScript并没有命名常量或对象的不可变属性的概念。(注意,这里我不是在说ES5。)

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

1
  var EXACTLY_ONE = 1;

当然,您的代码可以使用这个常量,尽管它不是真正的"常量",因为值是可以更改的(换句话说,属性是更新的)。


正如"尖刻的"如此仔细的注释,ecmascript没有这样的特性。但是,javascript可以:

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

当然,如果你正在编写代码,将其放到网络上,以便在网络浏览器中运行,这可能对你没有多大帮助。-)


除非用var关键字声明,否则所有内容都是全局的。

也没有常量。您可以不使用var关键字简单地声明它们。

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

1
window.GLOBAL_CONSTANT ="value";

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


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

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

如果希望常规函数执行此操作:

1
2
3
4
5
6
7
8
9
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);


如果您只关心支持较新的浏览器(或使用诸如babel之类的蒸腾器来支持较旧的浏览器),可以执行以下操作:

  • 使用所需的常量创建一个settings.js文件,并将其导出:
  • 1
    2
    export const FRUIT ="kiwi";
    export const VEGETABLE ="carrot";

  • 在要使用它们的文件中,可以按如下方式导入它们:
  • 1
    import * as Settings from './settings.js'

  • 然后,要使用常量,请执行如下操作:
  • 1
    console.log("The unchangeable fruit is" + Settings.FRUIT);

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


    如果要确保值不能更改,请使用函数。

    所以,不是:

    1
    var Const_X=12

    用途:

    1
    2
    3
    function Const_X() {
    return 12;
    }


    这个问题的直接答案是否定的。不过,如果ECMA/JS能够轻松地进行函数式编程,这将非常有帮助。我用来解决这个问题的一个可行的方法是在全局范围内声明一个常量,并使用一个包装函数。参见下面的示例:

    :)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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不是面向对象的,老师说他在C和C++之前就已经做过C语言的面向对象编程了。同样,您也可以用JavaScript进行函数式编程,但这要困难得多。这就像在C中做面向对象编程时更容易在C++中完成。