gpt4 book ai didi

javascript - JavaScript 中的常量变量

转载 作者:行者123 更新时间:2023-11-28 16:30:01 25 4
gpt4 key购买 nike

我试图拥有一些可以在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com