繁体   English   中英

我在哪里声明网页中的全局JavaScript变量?

[英]Where do I declare global JavaScript variables in a web page?

我需要在哪里放置一段JavaScript代码来初始化一个必须对页面执行的所有代码都可见的变量? (例如,元素上的事件处理程序将需要访问此变量)。

没有全局变量的唯一方法是在函数范围内使用var关键字。 其他任何东西都是全局变量。

(function() {
  var local = 5;
})();

如果函数是文字或函数定义并不重要,它必须是某种类型的函数。

全局变量示例:

1

var global = 5; 

以上不在函数范围内,因此即使使用var也是全局的。

2。

(function() {
   global = 5;
})();

在上面,没有使用var ,因此它成为隐含的​​全局。

3。

function foo(){}

foo未在另一个函数内部定义或未分配给对象键,因此可全局访问。

4。

(function() {
   var local = global = 5;
})();

使用var进行多次赋值时,只有第一个变量变为局部变量...所以global是一个全局变量,等于5。

5。

window.foo = 5;

前缀window. 是一种在浏览器上下文中定义全局变量的显式方法。

6。

this.x = 5;

默认情况下,在浏览器中, this指向DOMWindow,除非您在一个附加到非window对象的方法中。 它与#5相同。 请注意,如果使用XMLHttpRequest之类的方法,则上下文属于窗口。

7。

with ( window ) { name = 'john'; }

如果使用with语句并且不引用已具有属性的对象,则定义全局变量。 一般情况下,最好避免使用with关键字。

结论:

就个人而言,我会将我的代码保存在匿名函数范围内,并且在需要时显式声明全局变量。

(function() {

   var governor = 'Schwarzenegger',
       state = 'California';

   window.president = 'Obama';
})();

在上面,我定义了调控governorstate变量,它们是我的函数的本地变量。 我想明确将president定义为全局变量。 这样,我不会混淆我定义为全局变量的变量,因为我用window.明确地将它们作为前缀window.

您可以使用任何函数或函数执行此操作,而无需使用'var'关键字。 在任何其他脚本(可能是页面的顶部)之前分配它,以便脚本可以读取值。

您也可以将它放在一个包含的JS文件中,但是将它放在页面上通常更有用,因为您可以轻松地查看全局值,并且可以通过服务器端代码为每个页面修改它们。 同时尝试防止在正文中分配全局变量,它可能会造成混淆并且难以阅读。

<head>
    <script>
        var numberOfDucks = 1000; // Global

        function some_function() {
            // numberOfDucks is accessible here
            alert (numberOfDucks);
            //  until you mask it by defining a local variable using the 'var' keyword
            var myLocal = 0; // is a local
            anotherGlobal = 0; // is a global
        }
    </script>

    <script>
        // potentially some other script
    </script>

    <script src="even_more_script.js">
</head>

在函数中定义全局(隐含全局)并不是一个好主意,因为它会引起很多争议。

你可以将该变量放在页面的开头(如果你想让它在任何地方都可见的话,在全局范围内)但我建议两件事

1)因为你必须打开一个脚本块,所以避免在脚本阻止渲染时在页面体内声明它。 所以把它放在</head>之前

2)避免创建一个简单的var但使用命名空间代替,这样可以降低标识符冲突的风险

<script>
var YOUR_APP_NS = {};
YOUR_APP_NS.yourvar = ....
</script>

为了不污染全球范围,这是一种很好的做法。 如果以这种方式需要几个public var,你可以写

YOUR_APP_NS.yourvar1 = ....
YOUR_APP_NS.yourvar2 = ....
YOUR_APP_NS.yourvarN = ....

但全局变量仍为1

用你的任何函数声明变量,这样它就变成了一个全局变量。

这是一个全局变量的例子。 第一个函数使用全局函数,但第二个函数使用具有相同名称的局部变量来掩盖全局变量。

var globalVar = 1;

function testFunc1 () {
    globalVar = 2; //Updates the global variable
}

function testFunc2 () {
    var globalVar = 5; // This variable masks the global and only updates within the scope of this function
    globalVar = 3;
}

此外,您提到该代码段必须在任何其他引用之前初始化全局。 为此,我建议您尽可能在元素中的任何其他javascript引用之前放置脚本块或引用javascript文件。 如果您有其他javascript文件将依赖于全局变量,那么您可能希望确保它们不会加载,直到页面的其余部分首先使用defer属性加载。 请参阅以下内容:

<script src="dependant.js" type="text/javascript" defer="defer"></script>

另一个选项是在加载初始脚本后动态添加依赖脚本。 您可以使用jQuery之类的内容执行此操作,如下所示:

$(window).load( function() {
    $.getScript('dependant.js');
});
<head>
<script>
    var b = 0;
</script>
<script src="...">
</head>
<body>
    ...
</body>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM