所以我使用的代码是http://jsfiddle.net/8j947/10/,它为变量isLive返回值true或false。如何在以后的函数中使用变量onLive?我在Accessing variables from other functions without using global variables阅读了答案,但是我在使用它时遇到了很多麻烦。我想要的只是存储值,true或false,所以我可以在后面的函数中将它调用为if语句。谁能给我最简单的方法呢?有没有办法将数据存储为对象?
答案 0 :(得分:6)
只需在与定义依赖它的函数相同的范围内定义变量。如果你的函数在全局范围内,那么你的变量应该是。
如果您正在开发一个插件或控件或将在多个页面中使用的脚本,那么是的,请避免使用全局变量。另一方面,如果您需要在多个位置提供特定于页面的数据,则全局变量绝对合适。
评论家们!向下投票我!当你完成它时,检查我的其他一些答案,我实际上主张在HTML中使用表格! : - )
有时你必须了解这些规则,以便你知道什么时候可以打破它们。
现在,如果您刚刚意识到您的函数在全局范围内,并且您想要更改它,只需将所有代码包装在匿名函数中并立即调用它:
(function(){
var scopeLevelVariable = true;
function scopeLevelFn(){
...
}
window.globallyAvailableVariable = "foo";
window.globallyAvailableFunction = function(){
...
};
})();
答案 1 :(得分:4)
全局变量被认为是“邪恶的”,因为任何函数都可能无意中修改您的变量,这可能会导致一些难以跟踪的错误。对于简单的项目来说,这通常不是问题,但这是你应该考虑的事情。
要保存值而不会过多地混淆全局命名空间,从而降低上述错误的风险,您可以创建自己的“命名空间”对象(您链接的问题中接受的答案的选项2)。像这样:
var MyPageData = {};
MyPageData.someProperty = someFunc();
// Later on...
function anotherFunc() {
// Use the data you set...
alert(MyPageData.someProperty);
}
答案 2 :(得分:1)
我不同意全球变量本身就是邪恶的,只是在使用它们时需要采取一些预防措施。
为了避免与其他全局变量(可能是在包含的库中编写的变量)进行切割,我建议采取两种措施
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";
我认为如果你很好地组织你的全局变量,可以使用它们。希望这会有所帮助。
答案 3 :(得分:0)
您应该查看localStorage:http://diveintohtml5.ep.io/storage.html
答案 4 :(得分:0)
如果你正在处理一些特定的功能和数据,你可以这样做:
var yahooInterface = new function(){
var isLive = false;
this.function1(){ isLive = true };
this.function2(){ alert( isLive ) };
};
以这种方式,function1
和function2
共享数据,但它们不会浪费地污染全局命名空间。
答案 5 :(得分:0)
尝试modular javascript编程。
此外,closures对于保存信息而不将其暴露给全局命名空间非常有用。
如果你必须使用全局...创建自己的全局命名空间并在其中放置你需要的任何东西。当你冒险尝试其他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
答案 6 :(得分:-1)
如果您对使用全局变量感到厌烦,则可以创建一个返回变量的方法。
getVariable = function(){
return "Hello world!";
}
当它们被正确使用时,全局变量本身并不是邪恶的。如果你不需要,就不要使用它们。如果使用全局变量有充分的理由,那就没有错。