javascript - Javascript 中的常量变量

标签 javascript

我正在尝试拥有一些可以在 javascript 中使用的 const 全局变量,我提出了这段代码并从 SO 中提到的一些答案中获取。但似乎我在某个我无法发现的地方犯了一个小错误。有人可以帮我弄这个吗?

在 testQuery.js 中

(function (window, undefined) {

    var testQuery = function(obj) {
        if (!(this instanceof testQuery)) {
            return new testQuery(obj);
        }
    }

    var MYGLOBALS = function() {
        var globals = {
            foo : "bar",
            batz : "blah"           
        }

        return {
            getValue : function(s) {
                return globals[s];
            }
        }
    }();

    window.testQuery = testQuery;

}) (window);

在 html javascript 标记中,我有这行代码。

在 testQuery.html 文件中
<html>
  <head>
    <script src="testQuery.js"></script>
    <script>

       function onClick() {

             alert(MYGLOBALS.getValue("foo"));
       }

    </script>
  </head>

  <body>

      <input type="button" onclick="onClick()">

  </body>

</html>

最佳答案

变量 MYGLOBALS是您的作用域函数(没有名称的最外面的大函数)的本地函数,因此只能从该函数内部访问它。

我不确定您所说的“...在 html javascript 标记中...”是什么意思,但如果 alert您引用的内容超出了该范围功能,MYGLOBALS超出了它的范围。

更新 :关于 JavaScript 作用域的事情是它比人们想象的要简单得多。用 var 声明的变量对声明它们的范围(函数或全局;JavaScript 没有 block 级范围,所以 {} 不这样做)和该范围的子范围(例如,在其中声明或定义的函数)是私有(private)的它)。作用域完全是词法的——也就是说,它是你在源代码中看到的,而不是由其他一些运行时结构决定的。它们不会超出该范围,除非您在某处看到代码明确使这种情况发生,就像您的 window.testQuery = testQuery; 一样。行,它明确地使 testQuery位于 window 的房产因此是一个全局变量。 (即便如此,并不是变量已超出范围,只是您创建了一个新属性,该属性引用了更广泛可访问的同一事物。)

更新 2 : 回复你的评论

Actually what I am trying to do is to create something like what you would see when you are doing programming in other language where there will be a final static integer which you can put into the parameters fields on the functions you call. is there a better way of doing it? For example, in visual basic its something like me.background = Color.YELLOW. what I want is to have a static variable which will represent that YELLOW color.



JavaScript 没有用户定义的常量,也没有枚举。 (更新:这两个东西都可能随着 ES6 改变。)你要做的是定义一个具有属性的对象,例如:
var COLORS = {
    RED: "#FF0000",
    BLUE: "#0000FF",
    // ...
    GREEN: "#00FF00"
};

这些不是常数,没有什么可以阻止任何人分配给 COLORS.RED除了你告诉他们不要。

(更新:在 ES5 中,我们可以使用 Object.defineProperties 使这些属性保持不变,如下所示:
var COLORS = Object.defineProperties({}, {
    RED:   {value: "#FF0000"},
    BLUE:  {value: "#0000FF"},
    // ...
    GREEN: {value: "#00FF00"}
});

当您以这种方式定义属性时,默认情况下它是不可写的。)

对于您正在做的事情,您可能需要模块模式,其中您有一个全局符号,其值是一个对象,其他一切都是该对象的属性:
(function() {
    var mod;

    // Create the global, and also give ourselves a convenient alias for it (`mod`)
    window.MyModule = mod = {};

    // Colors
    mod.COLORS = {
        RED: "#FF0000",
        BLUE: "#0000FF",
        // ...
        GREEN: "#00FF00"
    };

    mod.testQuery = MyModule_testQuery;
    function MyModule_testQuery() {
        // Do something
    }

})();

alert(MyModule.COLORS.RED); // #FF0000
MyModule.testQuery();       // Do something

或者,如果您愿意,那 testQuery函数可以这样定义:
    mod.testQuery = function() {
        // Do something
    };

...但是函数是匿名的,我是 not a fan of anonymous functions . (请注意,名称 MyModule_testQuery 没有什么特别之处,这纯粹是我的命名约定。)

有点跑题了 :

关于我们在上面发布我们的全局符号的这一行:
// Create the global, and also give ourselves a convenient alias for it (`mod`)
window.MyModule = mod = {};

请注意,这非常特定于浏览器环境。我们可以通过一个微不足道的改变使其适用于任何 JavaScript 环境:
// Create the global, and also give ourselves a convenient alias for it (`mod`)
this.MyModule = mod = {};

这是有效的,因为我们是调用最外层作用域函数的人,所以我们知道我们没有使用任何特定的 this 来调用它。值(JavaScript 中的 this——与其他一些语言不同——完全取决于函数的调用方式,而不是函数的定义位置或方式)。所以既然我们知道我们没有使用任何特殊的this value,我们知道它将是全局对象,因为这就是 JavaScript 的工作方式。全局对象是window在网络浏览器上(实际上;从技术上讲,window 是全局对象上的一个属性,它指向自身)。

关于javascript - Javascript 中的常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6414240/

相关文章:

javascript - VueJs/Laravel。不同对象中多个数组的总和

javascript - JavaScript在另一个HTML页面上显示HTML值

javascript - Node strip 产品列表返回空

Javascript计算/更新onclick多个表单元素的总数

javascript - jQuery中的链接选择器

javascript - 使用 RaphaelJS 将路径缩放到纸张大小或以像素为单位设置路径尺寸

javascript - 使用 JavaScript 和 Canvas 绘制形状

javascript - 我想在javascript中动态调整图像怎么做?

javascript - Google Closure Compiler 内联了一个重复使用的私有(private)属性——一个缺陷还是我遗漏了什么?

javascript - 无法读取实例内对象(未定义?)的属性