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

时间:2011-08-11 20:30:55

标签: javascript jquery global-variables store

所以我使用的代码是http://jsfiddle.net/8j947/10/,它为变量isLive返回值true或false。如何在以后的函数中使用变量onLive?我在Accessing variables from other functions without using global variables阅读了答案,但是我在使用它时遇到了很多麻烦。我想要的只是存储值,true或false,所以我可以在后面的函数中将它调用为if语句。谁能给我最简单的方法呢?有没有办法将数据存储为对象?

7 个答案:

答案 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 ) };
};

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

实施例: http://jsfiddle.net/XpJFn/1/

答案 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!";
}

当它们被正确使用时,全局变量本身并不是邪恶的。如果你不需要,就不要使用它们。如果使用全局变量有充分的理由,那就没有错。