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