如何在.js文件中声明一个全局variables
我需要在所有.js
文件中需要一些全局variables。
例如,考虑以下4个文件:
-
global.js
-
js1.js
-
js2.js
-
js3.js
有没有办法,我可以在global.js
声明3个全局variables,并在任何其他3个.js
文件中访问它们,考虑到我将所有上述4个文件加载到HTML文档中?
有人可以告诉我,如果这是可能的或是否有工作要实现这一目标?
只需在函数范围外的global.js中定义你的variables:
// global.js var global1 = "I'm a global!"; var global2 = "So am I!"; // other js-file function testGlobal () { alert(global1); }
为了确保工作正常,在尝试访问该文件中定义的任何variables之前,必须包含/链接到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文件的加载中断初始页面加载,那么您可以在closures<body> -tag之前链接脚本标记。
推荐的方法是:
window.greeting = "Hello World!"
您可以在任何function中访问它:
function foo() { alert(greeting); // Hello World! alert(window["greeting"]); // Hello World! alert(window.greeting); // Hello World! (recommended) }
由于两个原因,这种方法是优选的。
-
意图是明确的。
var
关键字的使用可以很容易地导致声明为本地的全局vars
,反之亦然。 对于很多Javascript开发人员来说,这种variables范围是一个混乱点。 因此,作为一般规则,我确保所有variables声明都以关键字var
或前缀window
。 -
你用这种方法来标准化这个语法来读取variables,这意味着一个局部范围的variables不会打断全局variables,反之亦然。 例如,这里发生的是模棱两可的:
greeting = "Aloha"; function foo() { greeting = "Hello"; // overrides global! } function bar(greeting) { alert(greeting); } foo(); bar("Howdy"); // does it alert "Hello" or "Howdy" ?
但是,这是更清洁,更不容易出错(你不需要记住所有的variables范围规则):
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
它会提醒它很好。 你只需要在HTML文档中包含global.js
。
唯一的问题是你必须在窗口的范围内声明它(不在任何函数中)。
你可以将var
部分用nix来创build,但这不是一个好习惯。
如上所述,在脚本文件中使用最顶级的范围存在问题。 这是另一个问题:脚本文件可能是从某个运行环境中不是全局上下文的上下文运行的。
已经提出直接把全局分配给window
。 但是这也是运行时间依赖的 ,并不适用于Node等。这表明便携式全局variablespipe理需要仔细考虑和额外的努力。 也许他们会在未来的ECMS版本中修复它!
现在,我会推荐一些类似的东西来支持适用于所有运行环境的全局pipe理:
/** * 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", {});
这有点多打字,但它使您的全球variablespipe理面向未来。
免责声明:在查看以前版本的stacktrace.js时,这个想法的一部分来了。 我认为,还可以使用Bower或其他工具来获得更可靠和更less的运行时环境的黑客检测。
是的,你可以访问它们。 你应该在“公共空间”(在任何函数之外)声明它们:
var globalvar1 = 'value';
您可以稍后访问它们,也可以在其他文件中访问它们。