2010-11-13 88 views
3

我应该如何创建一个变量变量作为全局变量?Javascript全球变量

所以像:

function globVar(variable){ 
    window.variable; 
} 

所以这样我可以在自动模式下创建全局变量太多,而且我可以为自己创造他们更容易:)

编辑

例如,我可以像这样创建一个全局变量:globVar('myVariable');然后myVariable被添加到全局变量中。

+0

“全局变量”*是*(白色谎言)“窗口属性”(在浏览器上下文中)。你什么意思? – 2010-11-13 17:42:00

+0

当你调用globVar('myVariable')时,myVariable应该等于什么? – William 2010-11-13 17:47:29

+0

@Lime - 好了并不重要,但默认情况下应该是'null'。 :) – Adam 2010-11-13 17:48:49

回答

10

遗憾地说,但你收到的答案是坏习惯,你应该远离。 A 更好的编程练习,也许适当的编程练习,将伪命名空间您的全局变量,以便不混乱全局命名空间/范围。这背后的原因是让你的代码更易于管理,更重要的是,如果/当你的应用程序变大时,让你的生活更轻松。定义名称空间的简单机制是使用Douglas Crockford着名的模块模式。

这里有一个简单的例子:

var myNamespace = function(){ 
    var o = {}; 
    var globals = {}; 

    var setGlobVar = function(name, value) { 
    globals[name] = value; 
    }; 

    var getGlobVar = function(name) { 
    if (globals.hasOwnProperty(name)) { 
     return globals[name]; 
    } else { 
     // return null by default if the property does not exist 
     return null; 
    } 
    }; 

    o.setGlobVar = setGlobVar; 
    o.getGlobVar = getGlobVar; 
    return o; 
}(); 

要使用此功能,您只需把它像一个对象的方法。

myNamespace.setGlobVar("secret_msg", "Dumbledore dies, so does Hedwig"); 
myNamespace.getGlobVar("secret_msg"); 

你也可以暴露使用setGlobVargetGlobVar方法来使用它,如果你想简化你如何访问变量的globals变量,而不是。


的一点是,从定义变量在全局命名空间(即window对象)尽可能通过创建自己的命名空间望而却步。这减少了名称冲突的机会,意外重写或覆盖,并且再次,全局命名空间混乱。

更简单的做法是简单地定义一个对象并增加它的属性。

var globals = {}; 
globals.SECRET_MSG = "Snape is not a traitor" 

虽然我会通过包装globals到一个命名空间是具体到我的应用程序扩展这种方法。

var myNamespace = {}; 
myNamespace.globals = {}; 
myNamespace.globals.SECRET_MSG = "Snape is not a traitor" 

注:这其实是一样的原始模块的模式的方法,我建议,只是没有getset访问方法和编码不同。

+0

嗯,这看起来也很有趣,但我真的不明白整个事情:),我应该如何使用它?:\但正如我理解变量我想添加到'窗口'创建一个全局变量,你说我应该把它添加到另一个变量?例如,'globalVars.variable'? – Adam 2010-11-13 19:01:46

+0

这种方式也可以。重点是通过创建你自己的命名空间来远离在全局命名空间中定义变量(即,'window'对象)。我上面提出的方法对于你所需要的可能是过分的,但是如果你打算做任何Javascript开发,这是值得学习的。 – John 2010-11-13 19:13:58

+0

在我的答案底部添加了更多细节。 – John 2010-11-13 19:21:14

0

window.variable = variable;

不明白什么是“自动模式”,所以这可能不是你想要的。

+0

我给你看了一个函数,但我不认为这会起作用:),但我想这样,例如我可以像这样创建一个全局变量:'globVar('myVariable'); '然后'myVariable'被添加到全局变量中。 – Adam 2010-11-13 17:43:43

+0

没有必要将它“添加”到全局变量中 - 当您执行'window.variable = 123;'时,您将指定一个您将要使用的值。 – 2010-11-13 18:26:55

+0

如果你只是想获得用户设置的数据,你可以使用类似于:'window.variablesFromUsers = {};'。然后你的用户可以做这样的事情:'window.variablesFromUsers ['abc'] = 123;'你可以用同样的方式得到它:'window.variablesFromUsers ['abc']'会给你123. If你想获得用户设置的所有变量,你可以这样做:'for v in window.variablesFromUsers'并在循环中获得所有的名字(前面例子中的'abc'),然后执行'window.variablesFromUsers [o] '获取内容(例子中的123)。希望这可以帮助。 – 2010-11-13 18:29:13

1

调用该函数作为globVar('myVar','myVarValue')

function globVar(variable,value){ 
    window[variable] = value; 
} 

这里是一个的jsfiddle:http://jsfiddle.net/emQQm/

+0

嗯看起来有趣让我尝试它;) – Adam 2010-11-13 17:53:39

+0

我添加了一个jsfiddle:http://jsfiddle.net/emQQm/ – William 2010-11-13 17:55:50

+0

当然,问题是:为什么这很重要?为什么不直接写'window [variable] = value'并完成它呢? – Zecc 2010-11-13 18:03:45