代码之家  ›  专栏  ›  技术社区  ›  Giffyguy

全局常量可以用JavaScript声明吗?

  •  34
  • Giffyguy  · 技术社区  · 15 年前

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

    7 回复  |  直到 15 年前
        1
  •  26
  •   Pointy    7 年前

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

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

    <script>
      var EXACTLY_ONE = 1;
    

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

    编辑 -这是一个古老问题的古老答案。在2019年 const 几乎所有地方都支持的宣言。但是请注意 let , 常量 范围界定不同于 风险价值 范围界定。

        2
  •  29
  •   Ken    15 年前

    正如“Pointy”如此小心地指出的,ECMAscript没有这样的特性。然而, JavaScript does :

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

    当然,如果你写代码放在web上运行在web浏览器中,这可能对你没有多大帮助。:-)

        3
  •  13
  •   Josh K    15 年前

    一切都是全球性的,除非 var 关键字。

    也没有常数。您只需声明它们而不必 风险价值 关键字。

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

    window.GLOBAL_CONSTANT = "value";
    

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

        4
  •  7
  •   Basic Block    7 年前

    你可以像这样使用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);
    
        5
  •  4
  •   kojow7    8 年前

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

    1. 使用所需的常量创建settings.js文件并导出它们:
    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文件要在中使用常量时。

        6
  •  3
  •   Joe coqem2    12 年前

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

    所以,不要:

    var Const_X=12
    

    使用:

    function Const_X() {
    return 12;
    }
    
        7
  •  2
  •   Alvin Baldemeca    7 年前

    对这个问题的直接回答是否定的。如果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不是面向对象的,老师说他在C和C++之前就已经做过C语言的面向对象编程了。同样,您可以用Javascript进行函数式编程,但难度要大得多。这就像在C中做面向对象编程时更容易在C++中完成。

        8
  •  0
  •   magallanes    7 年前

    记录在案。

    // 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.
    

    所以,如果常量是在{}内定义的,那么它是局部的,否则,它是全局的。