代码之家  ›  专栏  ›  技术社区  ›  Tony the Pony

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

  •  10
  • Tony the Pony  · 技术社区  · 14 年前

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

    5 回复  |  直到 14 年前
        1
  •  12
  •   DarkWingDuck    14 年前

    您可以在任何函数外执行此操作,也可以在不使用“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>
    

    在函数中定义全局(隐含全局)不是一个好主意,因为它会造成很多混乱。

        2
  •  26
  •   meder omuraliev    14 年前

    这个 只有 没有全局变量的方法是使用 var 函数范围内的关键字。其他的都是全局变量。

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

    不管函数是文字定义还是函数定义 成为某种类型的函数。

    全局变量示例:

    :

    var global = 5; 
    

    以上不在函数范围内,因此即使 风险价值 使用。


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

    在上面,没有 风险价值 因此它成为一个隐含的全局。

    三。

    function foo(){}
    

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

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

    使用执行多个任务时 风险价值 ,只有第一个变量变为局部变量。。。所以 global 是一个全局变量,等于5。

    window.foo = 5;
    

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

    this.x = 5;
    

    默认情况下在浏览器中, this 指向DOMWindow,除非您所在的方法附加到 window . 和5号一样。注意,如果使用XMLHttpRequest之类的方法,则上下文是窗口的上下文。

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

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

    结论:

    就我个人而言,我会将代码保存在一个匿名函数作用域中,并且 只有 需要时显式声明globals。

    (function() {
    
       var governor = 'Schwarzenegger',
           state = 'California';
    
       window.president = 'Obama';
    })();
    

    在上面,我定义了 governor state 变量,它们是函数的局部变量。我想明确定义 president 作为全局变量。这样,我就不会混淆哪些变量被定义为全局变量,因为我显式地在它们前面加上前缀 窗户。 .

        3
  •  3
  •   fcalderanfcalderan    14 年前

    您可以将该变量放在页面的开头(如果必须使其在任何地方都可见,则放在全局范围内),但我建议您做两件事

    1)由于必须打开脚本块,请避免在页面正文中声明它,因为脚本块呈现。所以把它放在前面 </head>

    2)避免创建一个简单的var,而是使用一个名称空间,这样可以减少标识符冲突的风险

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

    为了不污染全球范围,这是一个良好的做法。如果你用这种方法需要几个公共var,你可以直接写

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

    但全球var仍为1

        4
  •  1
  •   Brian Scott    14 年前

    将变量与任何函数一起声明,这样它就成为一个全局变量。

    下面是一个全局变量的示例。第一个函数使用全局变量,而第二个函数使用具有相同名称的局部变量来屏蔽全局变量。

    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');
    });
    
        5
  •  0
  •   Floyd user1988754    14 年前
    <head>
    <script>
        var b = 0;
    </script>
    <script src="...">
    </head>
    <body>
        ...
    </body>