存储供以后函数使用的值的最佳方法是什么?我听说全局变量是邪恶的

What is the best way to store a value for use in a later function? I'm hearing global variables are evil

本文关键字:是什么 听说 邪恶 全局变量 方法 函数 存储 最佳      更新时间:2023-09-26

所以我使用的代码是在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 ) };
};

通过这种方式,function1function2共享数据,但它们不会浪费地污染全局命名空间。

的例子: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!";
}
如果使用得当,全局变量本身并不是邪恶的。如果你不需要,就不要使用它们。如果有充分的理由使用全局变量,那就没有什么错。