如何在 .js 文件中声明全局变量

IT技术 javascript global-variables
2021-01-30 20:22:59

我需要一些在所有.js文件中都需要的全局变量

例如,考虑以下 4 个文件:

  1. global.js
  2. js1.js
  3. js2.js
  4. js3.js

考虑到我将上述所有 4 个文件加载到 HTML 文档中,有没有办法可以在其中声明 3 个全局变量global.js并在其他 3 个.js文件中的任何一个中访问它们

有人可以告诉我这是否可行,或者是否有解决方法来实现这一目标?

5个回答

只需在函数范围之外的 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> 标记之前链接脚本标记。

同意。我总是尝试将所有函数和变量放在一个共同的“命名空间”中,以避免混乱和冲突。通常我将其命名为项目或公司的缩写。
2021-03-16 20:22:59
虽然这个答案是正确的,但我建议您谷歌 Javascript 变量范围以获得更好的理解,并可能避免以这种方式做事。
2021-04-01 20:22:59
@Andrew 这个答案是八年前写的。无论出于何种意图和目的,当时都是正确的。如果您想真正做出贡献,您可能想要建议进行编辑?
2021-04-01 20:22:59
反对这个答案和其他人喜欢它,因为它假设全局变量将在全局范围内创建,并且它还要求在所有其他提及之前首先提到该变量在全局范围内。
2021-04-07 20:22:59
@PatrikAkerstrand 约会实际上没有区别。使用全局对象的其他答案就足够了;我解释了为什么不是。
2021-04-10 20:22:59

推荐的方法是:

window.greeting = "Hello World!"

然后您可以在任何函数中访问它:

function foo() {

   alert(greeting); // Hello World!
   alert(window["greeting"]); // Hello World!
   alert(window.greeting); // Hello World! (recommended)

}

这种方法是首选的,原因有二。

  1. 意图是明确的。var关键字的使用很容易导致声明vars本地的全局,反之亦然。这种变量作用域是许多 Javascript 开发人员的困惑点。因此,作为一般规则,我确保所有变量声明都以关键字var或前缀 开头window

  2. 您也可以通过这种方式标准化此语法以读取变量,这意味着局部范围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"
将变量附加到窗口应该适用于所有浏览器(这也是我采用的方法,+1!)。
2021-03-24 20:22:59
@zkent,没错,但是使用 Window 对象仍然更好,因为您可能想稍后将您的代码变成诸如咖啡之类的东西。
2021-03-27 20:22:59
使用 Window 而不是 Document 前缀更好吗?
2021-04-02 20:22:59
@Dan,如果你声明“var testvar='hello';” 在函数之外,它会自动添加到 window 对象中,您可以使用“window.testvar”访问它。
2021-04-12 20:22:59

你试过吗?

如果你这样做:

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 或其他工具来获得对运行时环境的更可靠和更少黑客攻击的检测。

GLOBAL现在已弃用,global应改为使用。
2021-03-28 20:22:59

是的,您可以访问它们。您应该在“公共空间”(在任何功能之外)将它们声明为:

var globalvar1 = 'value';

您可以稍后访问它们,也可以在其他文件中访问它们。