【问题标题】:Is it ok to place all JS / jQuery variables at top of file? Global variables?可以将所有 JS / jQuery 变量放在文件顶部吗?全局变量?
【发布时间】:2013-06-23 00:21:22
【问题描述】:

我喜欢对我的代码进行极简主义,所以可以在文件的最顶部声明​​很多变量吗?我知道这将使它们全球化?

全局是否意味着该特定文件中的任何代码都可以使用这些变量?或者这是否意味着如果我使用具有“单独” js 文件的插件,该文件也可以使用我的全局变量,并可能导致错误?

那么在没有 var 的情况下编写这样的变量是否存在安全威胁

ab = $('#div32');
bc = 1000;

另外,我也可以只使用变量吗?

zy = $(window);
yy = $(document);

另外,在变量后面加逗号(最后一个除外)然后在每个变量后面加分号有什么区别?有什么影响吗?

【问题讨论】:

  • 每个问题只问一个问题。 -1

标签: file variables var


【解决方案1】:

如果这是一个问题,那么你可以把你的脚本包装在

(function(){
   var ab = $('#div32');
   var bc = 1000;
})()

然后它们将在函数范围而不是全局范围中声明。

通过写 ab = $('#div32');您将 javascript 遇到的第一个 ab 设置为 $('#div32');这可以已经声明,或者您将在尝试设置它时创建它。这不是一个安全问题,而是一个稳定性问题。

就逗号与分号而言,除了传输数据量可能略有减少之外,您不会看到任何差异。

var foo = 1, bar = 2;

在功能上与

相同
var foo = 1;
var bar = 2;

编辑:正如乔所指出的,我应该提到第三种情况。

var foo = 1; bar = 2;

这将在函数范围内设置变量 foo,并在全局范围内创建/修改变量 bar(取决于 bar 是否已经存在)

【讨论】:

  • ... 但它在功能上与 "var foo=1; bar = 2;" 不同
【解决方案2】:

我喜欢对我的代码进行极简主义,所以可以只声明一个 文件顶部有很多变量。我明白这 会让它们全球化吗?

唯一的问题是没有封装,代码有点乱,更好的方法是创建一个包含所有需要的变量的全局对象,如下所示:

而不是:

ab = $('#div32');
bc = 1000;

你会使用:

myData = { 
  ab : $('#div32'),
  bc : 1000
}

或者:

myData = {} ; // or =  new Object;
myData.ab = $('#div32');
myData.bc = 1000;

并且要访问您的全局变量:

console.log(myData.ab);

您的myData 对象也可以保存函数:

myData.sumTwoVariable = function(a,b){return a+b;}

一篇关于对象内函数的好文章:Different ways to add functions to Javascript object

全局是否意味着该特定文件中的任何代码都可以 使用那些变量?或者这是否意味着如果我使用的插件 有一个“单独的”js 文件,该文件可以使用我的全局变量 也一样,并且可能导致错误?

如果它们是在全局范围内声明的(使用或不使用var,没有区别),那么是的,它们可以在其他 js 文件中访问,是的,如果相同的变量名称是,它可能会导致错误和问题也用于全局范围内的其他 javascript 文件,在这种情况下,您的变量将被覆盖,并将具有最近影响的值。

如果您想阅读更多内容,这是一篇不错的帖子:Javascript: Scope of a Variable across different Javascript files

那么写这样的变量是否存在安全威胁,没有 变量

var仅用于指定函数范围内的局部变量请阅读这篇文章:What is the purpose of the var keyword and when to use it (or omit it)?

ab = $('#div32');公元前 = 1000;另外,我可以只使用变量然后 这些也是?

是的,你可以。

zy = $(窗口); yy = $(文档);另外,有什么区别 将逗号放在变量之后(最后一个除外),然后放 每一个后加分号?有什么影响吗?

没有区别。 这会起作用:

zy = $(window); yy = $(document);

还有这个:

zy = $(window),  yy = $(document);

【讨论】:

    【解决方案3】:

    一个非常好的问题,因为很多人都会遇到 JavaScript 变量范围的问题。最初,您的第一个假设应该始终是避免全局变量。

    为什么?这是由于范围。在全局级别定义的任何变量都可能被覆盖。因此,在您的程序中运行的任何 JavaScript,无论是您自己编写的还是其他方式编写的,都可以访问该变量。更糟糕的是,它们可能会在循环迭代等过程中被覆盖,从而导致非常奇怪的行为(这可能很难调试)。

    首先,我建议你通过example on this page。它会给你一个非常好的想法/复习范围的实际含义、var 关键字的相关性以及你可能遇到的潜在问题。

    然后,总是值得询问一个变量是否真的需要是全局的,以及它是否适合您的程序设计。我毫不怀疑在某些情况下全局变量是有意义的......但总的来说,它们可以而且应该避免

    编辑:总体上说您可以选择不同的模型可能太笼统了。但是,这里有一些 cmets 说,如果您正在编写一小段孤立的代码,那就没关系了。这是我真正不同意的一点......你永远无法完全预测你的代码最终将在哪里以及如何在生产系统中使用,并且在开始时不考虑像全局变量这样的潜在头痛不是一个好习惯。

    【讨论】:

      【解决方案4】:

      我同意 PJR,并且我也在使用下面给出的代码。

      var myApplicationModule = {};
      
      myApplicationModule.isIE = false;
      myApplicationModule.populateErrorsData = function() {
      }
      

      如果您想在整个应用程序或许多模块中使用这些变量,那么您可以创建一个通用 js 文件,例如 common.js,并将此代码包含在 common.js 文件中。您可以在任何需要此代码的地方包含此文件。

      谢谢, 克里山

      【讨论】:

        【解决方案5】:

        我的回答是关于全局变量。正如其他人也提到的那样,您加载到页面中的每个脚本(您的或其他库)都可以使用/访问您的全局变量。另请注意,在浏览器中使用 javascript 时,您自定义的变量/函数位于“window”对象下。

        除了创建许多全局变量/函数之外,还可以选择创建一个应用程序范围的全局变量。然后,您可以根据需要向该对象添加其他全局元素(变量甚至函数作为属性)。您可以更进一步,为每个特定任务创建子属性。这将有助于保持代码简洁,并通过提供一种子分组使查看您的代码的其他人更容易理解。

        举个例子

        var myapp = {};
        //creating a global mathmodule property under myapp that does all the math related work 
        myapp.mathmodule = {};
        myapp.mathmodule.myvariable1 = 7;
        myapp.mathmodule.myvariable2 = 3;
        myapp.mathmodule.add = function() {
                    myapp.mathmodule.sumvalue =  
                                       myapp.mathmodule.myvariable1+myapp.mathmodule.myvariable2;
                };
        myapp.mathmodule.substract = function () {
                    myapp.mathmodule.differencevalue =
                                       myapp.mathmodule.myvariable1 - myapp.mathmodule.myvariabl2;
                };   
        //creating a global logmodule property under myapp that does all the logging work 
        myapp.logmodule ={};
        myapp.logmodule.defaultmessage = "Default Values";
        myapp.logmodule.logresults = function () {   
        console.warn('myapp.mathmodule.sumvalue:'+window.myapp.mathmodule.sumvalue);                          
        console.warn('myapp.mathmodule.sumvalue again:'+myapp.mathmodule.sumvalue); 
        
        console.warn('myapp.mathmodule.differencevalue:'+window.myapp.mathmodule.differencevalue);                        
        console.warn('myapp.mathmodule.differencevalue again:'+myapp.mathmodule.differencevalue);
        };
        myapp.logmodule.logdefaultvalues = function () {                               
                        console.log(myapp.logmodule.defaultmessage);                      
                        console.log('myapp.mathmodule.myvariable1:'+myapp.mathmodule.myvariable1);                            
                        console.log('myapp.mathmodule.myvariable2:'+myapp.mathmodule.myvariable2);
                };
        

        //你可以使用类似的功能

        myapp.mathmodule.add();
        myapp.mathmodule.substract();
        myapp.logmodule.logresults();
        myapp.logmodule.logdefaultvalues();
        

        在文件顶部创建一个没有 var 的新变量可能不会太糟糕,但在函数中使用它肯定会令人困惑(其他阅读您的代码的人将不确定您是否真的打算从您的功能没有彻底阅读我们的代码),并可能导致不可预知的结果。 Javascript 有两个范围“函数级别”和“全局”,如果您不在函数中使用“var”关键字,则您定义的任何变量都会在全局范围内创建,尽管您的分配可能在函数内。这样创建的变量现在可以通过您的应用程序中的任何代码段进行访问/操作。

        您可以尝试使用立即调用函数表达式 (IIFE) 在 javascript 中模拟块作用域。我最近被介绍到这个词。

        通过http://en.wikipedia.org/wiki/Immediately-invoked_function_expressionhttp://benalman.com/news/2010/11/immediately-invoked-function-expression查看更多信息

        //if the code below followed the code at the top
        //anything defined within this function is not exposed elsewhere 
        (function () {
          var myapp = "Trying to overide the global myapp value";
          console.log("Testing myapp value in an iife:",myapp);
          console.log('Global myapp still accessible via window object:',window.myapp);
        }());
        
        console.log('myapp value outside of iife is the global value:',myapp);
        

        输出将是

        Testing myapp value in an iife: Trying to overide the global myapp value 
        Global myapp still accessible via window object: Object {mathmodule: Object, logmodule: Object}
        myapp value outside of iife is the global value: Object {mathmodule: Object, logmodule: Object}
        

        【讨论】:

          【解决方案6】:

          在B/S结构中,“全局”是指窗口。

          例子

          ab = $('#div32');
          
          $(window).load(function() {
              console.log(window.ab.text());// text of div32.
              console.log(window.ab === ab);//true
              bc = 1000;//Become global.
          });
          
          setTimeout(function() {
              console.log(window.bc);// 1000
          }, 1000);
          

          全局是否意味着该特定文件中的任何代码都可以使用这些变量?或者这是否意味着如果我使用具有“单独” js 文件的插件,该文件也可以使用我的全局变量,并可能导致错误?

          是的。当他们可以访问窗口对象时(他们总是可以),他们也可以使用“全局变量”,也可能导致错误。

          那么在没有 var 的情况下编写这样的变量是否存在安全威胁

          Yes.Variables 没有 var 成为窗口范围,无论代码在哪里。就像上面的变量“bc”。

          我也可以只使用变量吗?

          是的。除了捷径之外没有任何意义。

          我同意其他人对“逗号”的看法。

          终于,

          是否可以将所有 JS / jQuery 变量放在文件顶部?全局变量?

          在我看来,这不好。 但是“ok”与否取决于您的需求。

          就像@Covar 所说,

          如果您正在编写一些相当小的东西,那么将所有变量声明为全局变量肯定没有(技术上)错误,但如果您正在编写一些会增长的东西......

          你也应该看看this

          【讨论】:

            【解决方案7】:

            全局变量的主要问题是您可能会覆盖其他变量或让它们被其他库覆盖。避免弄乱全局范围总是更好的。例如,JQuery 将所有内容放入单个变量(函数)中,并利用闭包等来访问事物。

            至于逗号和分号。分号在 javascript 中是可选的,但出于各种原因(如清晰度)绝对推荐使用。声明变量时使用逗号只是逐个声明变量的捷径。

            【讨论】:

              【解决方案8】:

              首先我要说,我不一定有大量的 JavaScript 经验。但是,在其他语言中(我假设 JavaScript 仍然是这种情况),这是非常糟糕的代码实践。

              变量的范围应仅限于功能/模块/类/等。需要使用它们。如果您发现自己必须不断地使用全局范围来传递数据,那么您可能做错了什么。

              【讨论】:

                【解决方案9】:

                全局变量的范围是程序,所以如果你引入其他也使用相同全局变量名称的 javascript,你几乎肯定会遇到错误。

                如果您正在编写一些相当小的东西,那么将所有变量声明为全局变量肯定没有(技术上)错误,但是如果您正在编写一些会增长的东西,那么使用某种形式的 @ 可能对您有利987654321@ 为您的变量提供另一个级别的范围并最大限度地减少全局变量的使用。使用模块模式,您通常可以将全局变量缩减到 Module 命名空间,而通常是全局变量,范围仅限于模块。

                【讨论】:

                  猜你喜欢
                  • 2023-03-14
                  • 2011-09-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-04-26
                  • 2016-12-24
                  • 2019-07-24
                  • 2017-11-08
                  相关资源
                  最近更新 更多