javascript - JavaScript 中的常量变量

标签 javascript

我试图拥有一些可以在javascript中使用的常量全局变量,我得出了这段代码并从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 值(this在 JavaScript 中(与其他一些语言不同),完全取决于函数的调用方式,而不是定义的位置或方式。因此,既然我们知道我们没有使用任何特殊的 this 值,我们就知道它将是全局对象,因为这就是 JavaScript 的工作方式。全局对象是 Web 浏览器上的 window(实际上;从技术上讲,window 是全局对象上引用自身的属性)。

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

相关文章:

javascript - CKEditor 的 HTML 文件上传插件

javascript - 将 DOM 元素转换回 HTML

javascript - 在 Node.js 应用程序中存储 Active Directory 凭据的位置

javascript - bootstrap data-dismiss ="alert"——并重定向其他页面

php - 使用 CURL PHP 在 javascript 执行后获取 HTML 代码

javascript - 如何从 JSON 对象解析 HTML 标签

javascript - JQuery 对象的 offsetTop 值与 offset 函数返回的值不同

javascript - 单个 JavaScript 点击事件中的多个 ID

javascript - React Router 链接到新选项卡

javascript - 如何使用 jQuery 按类型和父 div 选择文本区域?