File 将所有JS/jQuery变量放在文件的顶部可以吗?全局变量?
我喜欢对我的代码进行最小化,所以在文件的最顶端声明很多变量可以吗。我知道这将使他们全球化 全局是否意味着该特定文件中的任何代码都可以使用这些变量?或者,这是否意味着,如果我使用的插件有一个“单独的”js文件,该文件也可以使用我的全局变量,并可能导致错误 那么,在没有var的情况下编写这样的变量是否存在安全威胁File 将所有JS/jQuery变量放在文件的顶部可以吗?全局变量?,file,variables,var,File,Variables,Var,我喜欢对我的代码进行最小化,所以在文件的最顶端声明很多变量可以吗。我知道这将使他们全球化 全局是否意味着该特定文件中的任何代码都可以使用这些变量?或者,这是否意味着,如果我使用的插件有一个“单独的”js文件,该文件也可以使用我的全局变量,并可能导致错误 那么,在没有var的情况下编写这样的变量是否存在安全威胁 ab=$('#div32'); bc=1000; 还有,我可以用变量来处理这些问题吗 zy=$(窗口); yy=$(文件); 另外,在变量后面加逗号(最后一个除外)和在每个变量后面加分
ab=$('#div32');
bc=1000;
还有,我可以用变量来处理这些问题吗
zy=$(窗口);
yy=$(文件);
另外,在变量后面加逗号(最后一个除外)和在每个变量后面加分号有什么区别?它对任何东西都有影响吗?全局变量的作用域是程序,因此,如果引入其他同样使用相同全局变量名的javascript,几乎肯定会遇到bug
如果你写的东西相当小,那么将所有变量声明为全局变量(从技术上讲)肯定没有错,但是如果你写的东西将增长,那么使用某种形式的变量为变量提供另一个级别的范围并最小化全局变量的使用可能会对你有利。使用模块模式,您通常可以将全局变量减少到模块名称空间,通常是全局变量,范围仅限于模块。首先让我说一句,我不一定有丰富的JavaScript经验。然而,在其他语言中(我假设JavaScript仍然如此),这是非常糟糕的代码实践
变量的作用域应仅限于需要使用它们的函数/模块/类/等。如果您发现自己一直不得不使用全局范围来传递数据,那么您可能是做错了什么。全局变量的主要问题是您可能会覆盖其他变量或让其他库覆盖它们。最好避免弄乱全局范围。例如,JQuery将所有内容都放在一个变量(函数)中,并利用闭包等来访问内容
至于逗号和分号。分号在javascript中是可选的,但出于各种原因(如清晰性)推荐使用分号。在声明变量时使用逗号只是逐个声明变量的捷径。如果这是一个问题,那么您只需将脚本打包即可
(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是否已存在)在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所说
如果你写的东西相当小,那么把所有变量都声明为全局变量当然没有什么(技术上)问题,但是如果你写的东西会越来越多
你也应该看看。我的回答是关于全局变量的。正如其他人也提到的,您的全局变量可以被加载到页面(您的或其他库)中的每个脚本使用/访问。还要注意,在浏览器中使用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”关键字,则任何变量
//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}
var myApplicationModule = {};
myApplicationModule.isIE = false;
myApplicationModule.populateErrorsData = function() {
}
ab = $('#div32');
bc = 1000;
myData = {
ab : $('#div32'),
bc : 1000
}
myData = {} ; // or = new Object;
myData.ab = $('#div32');
myData.bc = 1000;
console.log(myData.ab);
myData.sumTwoVariable = function(a,b){return a+b;}
zy = $(window); yy = $(document);
zy = $(window), yy = $(document);