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