存储供以后函数使用的值的最佳方法是什么?我听说全局变量是邪恶的
What is the best way to store a value for use in a later function? I'm hearing global variables are evil
所以我使用的代码是在http://jsfiddle.net/8j947/10/,它为变量isLive返回true或false的值。我如何在以后的函数中使用变量onLive ?我在不使用全局变量的情况下从其他函数访问变量的答案,但我有很多麻烦让它工作。我想要的只是存储值true或false,这样我就可以在后面的函数中将其调用到if语句中。谁能告诉我最简单的方法?是否有一种方法可以将数据存储为对象?
只要在定义依赖于它的函数的相同范围内定义变量即可。如果你的函数在全局作用域中,那么你的变量也应该在全局作用域中。
如果你正在开发一个插件或控件或脚本,将在多个页面中使用,那么是的,避免全局变量。另一方面,如果您需要在多个位置提供特定于页面的数据,则使用全局变量是绝对合适的。
有时候你必须明白规则,这样你才知道什么时候可以打破它们。
现在,如果你刚刚意识到你的函数是在全局作用域中,你想改变这一点,只要把你所有的代码包装在一个匿名函数中,并立即调用它:
(function(){
var scopeLevelVariable = true;
function scopeLevelFn(){
...
}
window.globallyAvailableVariable = "foo";
window.globallyAvailableFunction = function(){
...
};
})();
全局变量被认为是"邪恶的",因为任何函数都可能无意中修改您的变量,从而导致一些难以跟踪的bug。对于简单的项目来说,这通常不是问题,但这是你应该考虑的问题。
为了保存一个值而不会过多地混淆全局命名空间,从而降低上述错误的风险,您可以创建自己的"命名空间"对象(您链接的问题中可接受答案的选项2)。像这样:
var MyPageData = {};
MyPageData.someProperty = someFunc();
// Later on...
function anotherFunc() {
// Use the data you set...
alert(MyPageData.someProperty);
}
我不同意全局变量本身是邪恶的,只是在使用它们时需要采取一些预防措施。
为了避免与其他全局变量(可能是在包含的库中编写的全局变量)冲突,我建议采取两种措施
1)使用匿名函数(自调用)来保持你的代码(和变量)与其他代码的分离// other peoples/modules code
var myVariable = "whatever";
// anonymous function for your self contained code
(function(){
var myVariable = "inside closure";
alert(myVariable);
})() // the empty brackets envoke the anonymous function
// still retains value from before your self envoking anonymous function
alert(myVariable);
2)使用唯一的命名空间-并使您在同一对象下使用的所有全局变量避免污染
myUniqueNameSpaceRaiders = {};
// will not conflict with other global variables if your namespace is unique
myUniqueNameSpaceRaiders.desiredVariable = "something";
我认为如果你组织好你的全局变量,使用它们是很好的。
如果您正在处理一些特定的函数和数据集,您可以这样做:
var yahooInterface = new function(){
var isLive = false;
this.function1(){ isLive = true };
this.function2(){ alert( isLive ) };
};
通过这种方式,function1
和function2
共享数据,但它们不会浪费地污染全局命名空间。
的例子:http://jsfiddle.net/XpJFn/1/
尝试模块化javascript编程。
此外,闭包对于保存信息而不将其暴露给全局命名空间非常有用。
如果你必须使用全局…创建您自己的全局名称空间,并将所需的任何内容放入其中。这可能是一个很好的起点,因为你要冒险进入其他javascript模式。
。
//Global Namespace
window.ns = {};
ns.onLive = false;
if(ns.onLive === false) {
ns.notLive = !ns.onLive;
}
//Closures
var hello = (function() {
var onLive = true;
my.fn1 = function () {
return onLive;
}
my.fn2 = function () {
return !onLive;
}
return my;
})();
hello.fn1(); //true;
hello.fn2(); //false
你应该看看localStorage: http://diveintohtml5.ep.io/storage.html
如果您不愿意使用全局变量,您可以创建一个返回该变量的方法。
getVariable = function(){
return "Hello world!";
}
如果使用得当,全局变量本身并不是邪恶的。如果你不需要,就不要使用它们。如果有充分的理由使用全局变量,那就没有什么错。
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- JSDoc:模块和名称空间之间的关系是什么
- 存储供以后函数使用的值的最佳方法是什么?我听说全局变量是邪恶的