我需要一些在所有.js
文件中都需要的全局变量。
例如,考虑以下 4 个文件:
global.js
js1.js
js2.js
js3.js
考虑到我将上述所有 4 个文件加载到 HTML 文档中,有没有办法可以在其中声明 3 个全局变量global.js
并在其他 3 个.js
文件中的任何一个中访问它们?
有人可以告诉我这是否可行,或者是否有解决方法来实现这一目标?
我需要一些在所有.js
文件中都需要的全局变量。
例如,考虑以下 4 个文件:
global.js
js1.js
js2.js
js3.js
考虑到我将上述所有 4 个文件加载到 HTML 文档中,有没有办法可以在其中声明 3 个全局变量global.js
并在其他 3 个.js
文件中的任何一个中访问它们?
有人可以告诉我这是否可行,或者是否有解决方法来实现这一目标?
只需在函数范围之外的 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> 标记之前链接脚本标记。
推荐的方法是:
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
或前缀 开头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"
你试过吗?
如果你这样做:
var HI = 'Hello World';
在global.js
. 然后做:
alert(HI);
在js1.js
将罚款提醒它。您只需要global.js
在 HTML 文档中的其余部分之前包含。
唯一的问题是您必须在窗口的范围内(而不是在任何函数内)声明它。
您可以直接取消var
零件并以这种方式创建它们,但这不是一个好习惯。
如上所述,在脚本文件中使用最顶层范围存在问题。这是另一个问题:脚本文件可能从某个运行时环境中不是全局上下文的上下文中运行。
有人建议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 或其他工具来获得对运行时环境的更可靠和更少黑客攻击的检测。
是的,您可以访问它们。您应该在“公共空间”(在任何功能之外)将它们声明为:
var globalvar1 = 'value';
您可以稍后访问它们,也可以在其他文件中访问它们。