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

时间:2013-06-26 01:46:05

标签: file variables var

我喜欢用我的代码做极简主义,所以可以在文件的最顶层声明很多变量。我明白这会让他们全球化吗?

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

在没有var

的情况下编写这样的变量是否存在安全威胁
ab = $('#div32');
bc = 1000;

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

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

另外,在你的变量之后放置逗号(除了最后一个)然后在每个变量之后加上分号之间的区别是什么?它对任何事都有影响吗?

9 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

我的回答是关于全局变量。正如其他人也提到的那样,您加载到页面中的每个脚本(您的或其他库)都可以使用/访问您的全局变量。另请注意,在浏览器中使用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}

答案 2 :(得分:3)

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

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

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

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

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

var foo = 1, bar = 2;

在功能上与

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

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

var foo = 1; bar = 2;

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

答案 3 :(得分:2)

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

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

首先,我建议您浏览example on this page。它会给你一个非常好的想法/复习范围实际意味着什么,var关键字的相关性,以及你可能遇到的潜在恶意。

然后,总是值得问一个变量是否真的需要是全局的,如果这符合你的程序设计。我毫不怀疑总会有一些全局变量有意义的情况...... 但总的来说它们可以并且应该避免

编辑:可能过于通用了,总的来说你可以选择不同的模型。但是,这里有一些评论说如果你正在编写一小段孤立的代码,那就没关系了。这是我真的不同意的......你永远无法完全预测你的代码最终会在生产系统中使用的位置和方式,而不是在开始时就像全局变量这样的潜在问题并不是一种好的做法。 / p>

答案 4 :(得分:1)

在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);
  

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

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

  

在没有var

的情况下编写这样的变量是否存在安全威胁

是。没有var的变量成为窗口范围,无论代码是什么。像上面的变种“bc”。

  

我可以只使用变量吗?

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

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

最后,

  

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

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

就像@Covar所说,

  

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

你也应该看看this

答案 5 :(得分:1)

  

我喜欢用我的代码做极简主义,所以可以宣布一个   文件最顶部的很多变量。我理解这一点   会让他们全球化吗?

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

而不是:

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

  

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

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

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

  

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

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

  

ab = $('#div32'); bc = 1000;此外,我可以只使用变量   这些也是?

是的,你可以。

  

zy = $(窗口); yy = $(文件);另外,最重要的是什么   把逗号放在你的变量之后(除了最后一个)然后放   每一个后面都用分号?它对任何事都有影响吗?

没有区别。 这可行:

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

这也是:

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

答案 6 :(得分:0)

让我第一个说,我不一定有很多JavaScript经验。但是,在其他语言中,(我假设这仍然是JavaScript的情况),这是非常糟糕的代码实践。

变量应仅限于funcitons / modules / classes / etc。需要使用它们。如果您发现自己不断使用全局范围来传递数据,那么您可能做错了。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

var myApplicationModule = {};

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

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

谢谢, 克尚