2013-06-26 37 views
4

我喜欢用我的代码做简约主义,所以可以在文件的最上面声明很多变量。我明白这会让他们成为全球?把所有的JS/jQuery变量放在文件的顶部可以吗?全局变量?

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

是否存在安全威胁,那么像这样写变量,而VAR

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

另外,我可以只使用变量,则这些呢?

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

另外,什么把逗号的变量后(除了最后一个),那么每一个后把分号之间的区别?它对任何事物都有影响吗?

+2

请只问一个问题。 -1 – Doorknob

回答

3

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

(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(取决于是否禁止已存在)

+1

...但它在功能上与“var foo = 1; bar = 2;”的功能不同 – Joe

5

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

如果你写的东西相当小,将所有变量声明为全局变量当然没有什么(技术上)错误,但是如果你正在写的东西将会增长,那么使用某种形式的module pattern为您的变量提供另一级别的范围,并尽量减少Globals的使用。使用模块模式,通常可以将全局变量减少到模块名称空间,通常是全局变量,范围仅限于模块。

0

让我成为第一个说,我不一定有大量的JavaScript体验。但是,在其他语言中(我认为JavaScript仍然如此),这是非常糟糕的代码实践。

变量的范围应该仅限于功能/模块/类/等。需要使用它们。如果您发现自己始终不得不使用全局范围来传递数据,那么您可能会做错某些事情。

0

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

就逗号和分号而言。分号在javascript中是可选的,但由于各种原因(如清晰度)肯定会推荐。声明变量时使用逗号只是一个简单的声明,可以逐个声明它们。

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

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

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

然后像这样写变量存在的安全威胁,而VAR

Yes.Variables没有变种成为窗口范围等。无论代码。像上面的变量“bc”一样。

我可以只使用变量,然后为这些以及?

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

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

最后,

它是确定把所有JS/jQuery的变量在文件的顶部?全局变量?

在我看来,它不好。 但“确定”或不取决于您的需求。

像@Covar说,

如果你正在写不好声明所有变量为全局的东西相当小的肯定有什么(技术),但是如果你在写那将成长的东西...

你也应该看看this

4

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

而不是创建大量的全局变量/函数也可能是一个选项创建一个应用程序范围的全局变量。然后可以根据需要添加其他全局元素(变量甚至函数作为属性到这个对象)。您可以进一步采取这一措施,并为每个特定任务创建子属性。这将有助于保持代码清洁,并使其他人通过提供一种子分组来查看代码更容易理解。

举个例子

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} 
0

我PJR同意,我也使用代码如下。

var myApplicationModule = {}; 

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

在情况下,如果你想使用整个应用程序或多个模块这些变量,那么你可以创建一个共同的js文件说common.js,包括在common.js文件的代码。您可以在任何需要此代码的位置包含此文件。

感谢, 克尚

2

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

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

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

然后,总是值得询问一个变量是否真的需要是全球性的,如果这符合您程序的设计。毫无疑问,总会有一些情况下全局变量是有意义的... ,但总体而言,他们可以也应该避免

编辑:这可能太泛泛说,整体上你可以选择一个不同的模型。然而,这里有一些评论说,如果你正在编写一小段代码,那么它并不重要。这是我真正不同意的一点......你永远无法完全预测你的代码将在生产系统中最终被使用的位置和方式,而不是像一开始就考虑像全局变量那样的潜在头痛不是好习惯。

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

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

如果他们在全球范围内宣布(使用或不使用var,没有区别),然后是的,他们将在其他的js文件访问,并且是它可能会导致如果相同的变量名错误和问题也在全局范围内的其他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 = $(window); yy = $(document);另外, 在你的变量后面加上逗号(除了最后一个变量)然后在每个变量后加上 分号之间的区别是什么?它对任何事物都有影响吗?

没有区别。 这会工作:

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

这也太:每题

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