【问题标题】:Create a new unique global variable each time a function is run in javascript [duplicate]每次在javascript中运行函数时创建一个新的唯一全局变量[重复]
【发布时间】:2011-12-25 15:15:57
【问题描述】:

可能重复:
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!”当有人好心回答这个问题时。

【问题讨论】:

  • 您想要一个新的全局变量还是只是现有的全局变量id 有一个新值?
  • 你想避免全局变量。改为创建您自己的命名空间...
  • 只需将其设为数组并写入 vars[12345] 而不是 vars12345。
  • 感谢大家的精彩回答!

标签: javascript


【解决方案1】:

怎么样...

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,但我认为这个解决方案有点矫枉过正。您正在创建一个全局 store 变量,而不是全局 map 变量。在我看来,这只是增加了一些语法糖。
  • @pimvdb 是的,这有点矫枉过正。这是这种模式的最基本形式。当 get/set 行为更复杂(必须执行多个命令时)时,它会变得更有用...
【解决方案2】:

全局变量是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]);
}

【讨论】:

  • 我相信这仅适用于某些 JS 实现(例如浏览器中的实现,而不是 Node.JS,例如,那里没有 window)。
  • 哦,是的,我忘记了 Node 之类的 :(。我认为 node 使用 global 而不是 window,不知道其他...好吧,您可以中指编码标准和评估 x]。
【解决方案3】:

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

var g = {};

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

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

【讨论】:

    【解决方案4】:

    我会争辩说,您并不想创建很多全局变量。相反,您可以只创建一个全局对象或数组并将所有其他变量附加到它。在这种情况下,您可能需要一个对象:

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

    然后,为了稍后获取该信息,您可以使用以下命令检索它:

    var something = myIds[id];
    

    这个建议的原因是多方面的。首先,您希望尽量减少全局变量的数量,因为每个全局变量都有可能与您可能正在使用的其他脚本发生命名冲突。其次,在跟踪一堆相关数据时,将其保存在一个特定的数据结构中是一种更好的编程实践,而不是将其与所有其他数据一起放入巨大的全局容器中。

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

    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);
    

    【讨论】:

      猜你喜欢
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多