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

kp1*_*p11 82 javascript global-variables

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

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

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

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

有人可以告诉我这是否可行或是否有解决方法?

Pat*_*and 90

只需在函数范围外的global.js中定义变量:

// global.js
var global1 = "I'm a global!";
var global2 = "So am I!";

// other js-file
function testGlobal () {
    alert(global1);
}
Run Code Online (Sandbox Code Playgroud)

要确保这一点有效,您必须在尝试访问该文件中定义的任何变量之前包含/ link到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>
Run Code Online (Sandbox Code Playgroud)

当然,如果您不希望加载js文件来中断初始页面加载,您可以在关闭<body> -tag之前链接脚本标记.

  • 虽然这个答案是正确的,但我建议您使用Google Javascript变量范围来更好地理解并避免以这种方式做事. (4认同)
  • @Andrew 这个答案是八年前写的。无论出于何种意图和目的,这在当时都是正确的。如果您想真正做出贡献,您可能想建议进行编辑? (2认同)

ale*_*emb 85

建议的方法是:

window.greeting = "Hello World!"
Run Code Online (Sandbox Code Playgroud)

然后,您可以在任何功能中访问它:

function foo() {

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

}
Run Code Online (Sandbox Code Playgroud)

出于两个原因,这种方法是优选的.

  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" ?
Run Code Online (Sandbox Code Playgroud)

但是,这更清晰,更不容易出错(您实际上不需要记住所有变量范围规则):

 function foo() {
     window.greeting = "Hello";
 }

 function bar(greeting) {
   alert(greeting);
 }

 foo();
 bar("Howdy"); // alerts "Howdy"
Run Code Online (Sandbox Code Playgroud)


Pao*_*ino 7

你试过吗?

如果你这样做:

var HI = 'Hello World';
Run Code Online (Sandbox Code Playgroud)

global.js.然后做:

alert(HI);
Run Code Online (Sandbox Code Playgroud)

js1.js将罚款提醒它.您只需要global.js在HTML文档中包含其余内容.

唯一的问题是你必须在窗口的范围内声明它(不在任何函数内).

你可以只是修改var部分并以这种方式创建它们,但这不是一个好习惯.


Dom*_*omi 5

如上所述,在脚本文件中使用最高级作用域存在一些问题。这是另一个问题:在某些运行时环境中,脚本文件可能是从不是全局上下文的上下文中运行的。

已经提出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", {});
Run Code Online (Sandbox Code Playgroud)

键入的内容更多,但可以使全局变量管理永不过时。

免责声明:在查看早期版本的stacktrace.js时,我想到了部分想法。

我认为,还可以使用Webpack或其他工具来获得对运行时环境的更可靠和可靠的检测。

  • 现在不建议使用GLOBAL,而应该使用GLOBAL。 (2认同)