如何在JavaScript中声明全局变量?


Answers:


215

如果必须在生产代码中生成全局变量(应避免使用),请务必明确声明它们:

window.globalVar = "This is global!";

尽管可以通过省略来定义全局变量var(假设没有同名的局部变量),但这样做会生成隐式全局,这是一件不好的事情,并且在严格模式下会产生错误。


window仅在浏览器中可用。您可以编辑答案以使其在所有环境中都有效吗?请参阅如何在JavaScript中获取全局对象?
米哈尔Perłakowski

52

如果这是您唯一要使用此变量的应用程序,则Felix的方法很好。但是,如果您正在编写jQuery插件,请考虑jQuery对象下所需的“名称空间”(稍后在引号中进行详细说明...)变量和函数。例如,我目前正在使用一个名为miniMenu的jQuery弹出菜单。因此,我miniMenu在jQuery下定义了一个“命名空间” ,并将所有内容放置在其中。

我在谈论javascript名称空间时使用引号的原因是,从正常意义上说,它们并不是真正的名称空间。相反,我只是使用一个javascript对象并将所有函数和变量作为该对象的属性。

另外,为方便起见,我通常用 i仅用于内部内部使用的东西名称空间,以便对插件用户隐藏。

它是这样工作的:

// An object to define utility functions and global variables on:
$.miniMenu = new Object(); 
// An object to define internal stuff for the plugin:
$.miniMenu.i = new Object();

现在,我可以做$.miniMenu.i.globalVar = 3$.miniMenu.i.parseSomeStuff = function(...) {...}每当我需要在全球范围内保存的东西,我仍然保持它的全局命名空间。


感谢Tomas,在我上面提到的网站上,Felix的方法效果很好,但是我也正在另一个网站上工作,该网站使用了多个插件,如果我能使其正常工作,您的方法将是理想的选择。为您的帮助加油。
舞者

效果很好!只需确保如@Tomas所说,为您自己的自定义函数或变量创建自己的类/所有者。+1
Pierre

谢谢托马斯!如果不需要,请删除父对象(例如:) delete $.miniMenu。可以吗
2015年

1
@KunJ:当然,就像其他任何东西一样:如果您可以保证不再使用它,则可以安全地删除它。然而,JavaScript的垃圾收集起来给你,所以你不要delete $.miniMenu
Tomas Aschan

20

编辑 问题是关于JavaScript,答案是关于jQuery,这是错误的。从jQuery普及以来,这是一个古老的答案。

相反,我建议您了解JavaScript中的作用域闭包

旧的错误答案: 使用jQuery,无论声明在哪里,都可以执行以下操作:

$my_global_var = 'my value';

并将随处可见。当图像散布在不同的地方时,我用它来制作快速的图像库,如下所示:

$gallery = $('img');
$current = 0;

$gallery.each(function(i,v){
    // preload images
    (new Image()).src = v;
});
$('div').eq(0).append('<a style="display:inline-block" class="prev">prev</a> <div id="gallery"></div> <a style="display:inline-block" class="next">next</a>');
$('.next').click(function(){
    $current = ( $current == $gallery.length - 1 ) ? 0 : $current + 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});
$('.prev').click(function(){
    $current = ( $current == 0 ) ? $gallery.length - 1 : $current - 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});

提示:在此页面的控制台中运行整个代码;-)


3
$ gallery和$ current只是正常的全局变量吗?它们之所以起作用,是因为您通过省略'var'将它们定义为全局变量,但是在它们前面的美元符号并不能使它们成为'jQuery变量'...字面上就是在它们上加上下划线或任何其他符号...如果您使用jQuery对象($)并为其添加属性,它们将是jQuery变量:$ .myGlobalVariable ='my value'...
Andres Elizondo

您可能是对的,但值得注意的是,使用$ myVar语法可获得2个提示:1)变量是全局的,没有任何特殊声明(除$之外);2)您可以在代码中轻松跟踪全局变量。虽然开放讨论...
aesede

错误的答案。同意Andres,那根本不是jQuery变量。如果您未$current = 0;在函数的开头定义,则后面的函数将不起作用。
harrrrrrry

15

这是其余函数可以访问的全局变量的基本示例。这是一个为您提供的实时示例:http : //jsfiddle.net/fxCE9/

var myVariable = 'Hello';
alert('value: ' + myVariable);
myFunction1();
alert('value: ' + myVariable);
myFunction2();
alert('value: ' + myVariable);


function myFunction1() {
    myVariable = 'Hello 1';
}

function myFunction2() {
    myVariable = 'Hello 2';
}

如果要在jquery ready()函数中执行此操作,请确保变量与其他函数一起位于ready()函数内。


关于全局变量如何在jQuery中工作的最佳答案。
克林顿·格林

1
我知道我正在认真研究,但这甚至不是一个明确的全局变量。共享公共变量的范围更广一些,而公共变量的范围不限于非常小的脚本的闭包。它们是两种完全不同的方法/用法,如果您在多个不同脚本中间的脚本中声明显式全局变量,则这将给您带来重大麻烦。我只能想象团队的前端在脚本顶部声明一个全局变量,这是被调用到DOM中的第十个脚本。
布莱恩·埃利斯

4

在函数外部声明变量

function dosomething(){
  var i = 0; // can only be used inside function
}

var i = '';
function dosomething(){
  i = 0; // can be used inside and outside the function
}

3

最好的方法是使用closures,因为window对象的属性变得非常混乱

HTML

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="init.js"></script>
    <script type="text/javascript">
      MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Hello !</h1>
  </body>    
</html>

init.js(基于此答案

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function(i) {
            return _args[i];
        }
    };
}());

script.js

// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);

alert(a);

这是plnkr。希望对您有所帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.