我需要所有.js
文件中都需要的一些全局变量。
例如,考虑以下4个文件:
global.js
js1.js
js2.js
js3.js
考虑到我将上述所有4个文件都加载到HTML文档中,有没有一种方法可以在其中声明3个全局变量global.js
并在其他3个.js
文件中的任何一个中访问它们?
有人可以告诉我这是否可行吗?或者可以解决这个问题吗?
Answers:
只需在函数范围之外的global.js中定义变量:
// global.js
var global1 = "I'm a global!";
var global2 = "So am I!";
// other js-file
function testGlobal () {
alert(global1);
}
为确保此方法有效,您必须先包含/链接到global.js,然后再尝试访问该文件中定义的任何变量:
<html>
<head>
<!-- Include global.js first -->
<script src="/YOUR_PATH/global.js" type="text/javascript"></script>
<!-- Now we can reference variables, objects, functions etc.
defined in global.js -->
<script src="/YOUR_PATH/otherJsFile.js" type="text/javascript"></script>
</head>
[...]
</html>
当然,如果您不希望js文件的加载中断初始页面加载,则可以在结束<body> -tag之前的脚本标签中进行链接。
推荐的方法是:
window.greeting = "Hello World!"
然后,您可以在任何函数中访问它:
function foo() {
alert(greeting); // Hello World!
alert(window["greeting"]); // Hello World!
alert(window.greeting); // Hello World! (recommended)
}
首选此方法有两个原因。
目的是明确的。var
关键字的使用很容易导致声明全局变量vars
,而全局变量原本是本地变量,反之亦然。对于许多Javascript开发人员来说,这种变量作用域是一个混淆点。因此,作为一般规则,我确保所有变量声明都以关键字var
或prefix开头window
。
您还可以标准化语法以这种方式读取变量,这意味着局部作用域var
不会破坏全局变量,var
反之亦然。例如,这里发生的事情是模棱两可的:
greeting = "Aloha";
function foo() {
greeting = "Hello"; // overrides global!
}
function bar(greeting) {
alert(greeting);
}
foo();
bar("Howdy"); // does it alert "Hello" or "Howdy" ?
但是,这更加简洁,而且不易出错(您实际上不需要记住所有变量作用域规则):
function foo() {
window.greeting = "Hello";
}
function bar(greeting) {
alert(greeting);
}
foo();
bar("Howdy"); // alerts "Howdy"
如上所述,在脚本文件中使用最高级作用域存在一些问题。这是另一个问题:在某些运行时环境中,脚本文件可能是从不是全局上下文的上下文中运行的。
已经提出window
直接将全局分配给。但是,这也与运行时有关,并且不能在Node等中使用。这表明可移植全局变量管理需要仔细考虑和付出额外的努力。也许他们会在将来的ECMS版本中修复它!
就目前而言,我建议使用类似的方法来支持所有运行时环境的适当全局管理:
/**
* Exports the given object into the global context.
*/
var exportGlobal = function(name, object) {
if (typeof(global) !== "undefined") {
// Node.js
global[name] = object;
}
else if (typeof(window) !== "undefined") {
// JS with GUI (usually browser)
window[name] = object;
}
else {
throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported.");
}
};
// export exportGlobal itself
exportGlobal("exportGlobal", exportGlobal);
// create a new global namespace
exportGlobal("someothernamespace", {});
键入的内容更多,但可以使全局变量管理永不过时。
免责声明:在查看早期版本的stacktrace.js时,我想到了部分想法。
我认为,还可以使用Webpack或其他工具来获得对运行时环境的更可靠和可靠的检测。
GLOBAL
现在已弃用,global
应改为使用。