每次在javascript中运行函数时,创建一个新的唯一全局变量

时间:2011-12-25 15:15:57

标签: javascript

  

可能重复:
  Javascript dynamic variable name

一个非常基本的问题。我想在每次调用函数时创建一个新的javascript全局变量。变量应该包含元素的id,以便我以后可以轻松访问它。

id = 2347

//this function would be called multiple times, hopefully generating a new global each time
function (id)
{
var + id = something
// I want a variable that would be named var2347 that equals something, but the above line doesn't get it.
}

在后面的函数中,我想像这样访问变量:

function two (id)
{
alert(var + id);
}

我确定我会有一个“doh!”有人能够回答这个问题的那一刻。

4 个答案:

答案 0 :(得分:6)

怎么样......

var store = (function() {
    var map = {};

    return {
        set: function ( name, value ) {
            map[ name ] = value;
        },
        get: function ( name ) {
            return map[ name ];
        }
    };
})();

用法:

store.set( 123, 'some value' );

然后......

store.get( 123 ) // 'some value'
store.get( 456 ) // undefined

现场演示: http://jsfiddle.net/jZfft/

强烈建议程序员声明全局变量,因为浏览器已在全局命名空间中附带了数百个名称。对自己的变量使用全局命名空间可能会导致名称冲突,从而破坏程序或某些浏览器的功能。创建新的命名空间是免费的,所以不要害羞地去做...

答案 1 :(得分:4)

全局变量是window对象的属性,因此window.lolwindow['lol']定义了一个全局变量lol,可以通过以下任何方式访问它们。 第二个window['lol']也可以与变量名一起使用,如下所示:

var lol = 123;
var name = 'lol';
var content = window[name]; // window['lol'] == 123

content现在将包含123。 几乎任何东西都可以放在方括号[]之间,所以你也可以这样做:

var id = 123;
window['prefix' + id] = 'text';
var content = window['prefix' + id]; // prefix123 == text

或者,在您的情况下:

var id = 2347;
function one(id) {
  window['var' + id] = something;
}
function two(id) {
  alert(window['var' + id]);
}

答案 2 :(得分:3)

您可以将值保存到全局哈希:

var g = {};

function (id)
{
  g[id] = something;
}

function two (id)
{
  alert(g[id]);
}

答案 3 :(得分:2)

我认为你真的不想做很多全局变量。相反,您可以只创建一个全局对象或数组,并将所有其他变量附加到该对象或数组。在这种情况下,您可能需要一个对象:

var myIds = {};

function makeSomething(id) {
    // create something that goes with this id
    myIds[id] = something;
}

然后,要在以后的某个时间获取该信息,您可以使用以下方法检索它:

var something = myIds[id];

这个建议的原因是多方面的。首先,您希望最小化全局变量的数量,因为每个全局变量都可能与您可能正在使用的其他脚本发生命名冲突。第二,当跟踪一堆相关数据时,将它保存在一个特定的数据结构中是一种更好的编程实践,而不是仅仅将其全部放入包含所有其他数据的巨型全局bin中。

甚至可以创建一个管理所有这些的对象:

function idFactory() {
    this.ids = {};
}
idFactory.prototype = {
    makeSomething: function(id) {
        // create something that goes with this id
        this.ids[id] = something;
    },
    retrieveSomething: function(id) {
        return(this.ids[id]);
    },
    clear: function() {
        this.ids = {};
    } 
};

// then you would use it like this:
var myIds = new idFactory();
myIds.makeSomething(2347);
var value = myIds.retrieveSomething(2347);