4

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

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

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

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

另外,我也可以对这些变量使用变量吗?

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

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

4

9 回答 9

5

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

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

于 2013-06-27T17:42:28.420 回答
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}
于 2013-07-04T19:59:08.067 回答
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(取决于 bar 是否已经存在)

于 2013-07-03T21:02:20.013 回答
2

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

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

首先,我建议你浏览一下这个页面上的例子。它会给你一个非常好的想法/复习范围的实际含义、var关键字的相关性以及你可能遇到的潜在问题。

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

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

于 2013-07-05T13:56:13.517 回答
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;}

一篇关于对象内函数的好文章:向 Javascript 对象添加函数的不同方法

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

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

如果您想阅读更多内容,这是一篇不错的文章:Javascript:跨不同 Javascript 文件的变量范围

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

var仅用于指定函数范围内的局部变量请阅读这篇文章:var 关键字的用途是什么以及何时使用它(或省略它)?

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

是的你可以。

zy = $(窗口);yy = $(文档); 另外,在变量后面加逗号(最后一个除外)然后在每个变量后面加分号有什么区别?它对任何事情都有影响吗?

没有不同。这会起作用:

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

这也是:

zy = $(window),  yy = $(document);
于 2013-07-05T15:42:49.327 回答
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的情况下编写这样的变量是否存在安全威胁

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

那么我也可以对这些变量使用变量吗?

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

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

最后,

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

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

就像@Covar 所说,

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

你也应该看看这个

于 2013-07-04T07:44:32.907 回答
0

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

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

于 2013-06-28T18:58:43.313 回答
0

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

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

于 2013-06-28T18:51:21.253 回答
0

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

var myApplicationModule = {};

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

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

谢谢, 克里山

于 2013-07-05T12:59:10.383 回答