Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每次在javascript中运行函数时,创建一个新的唯一全局变量_Javascript - Fatal编程技术网

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

每次在javascript中运行函数时,创建一个新的唯一全局变量,javascript,Javascript,可能重复: 一个非常基本的问题。我想在每次调用函数时创建一个新的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 nam

可能重复:

一个非常基本的问题。我想在每次调用函数时创建一个新的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!”时刻。

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

var g = {};

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

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

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

var lol = 123;
var name = 'lol';
var content = window[name]; // window['lol'] == 123
内容现在将包含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]);
}
那么

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
现场演示:


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

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

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

您想要一个新的全局变量还是一个现有的全局变量
id
有一个新值?您想要避免使用全局变量。创建您自己的名称空间…只需将其设置为数组,并编写vars[12345]而不是vars12345。感谢所有人提供这些伟大的答案!我相信这只适用于一些JS实现(比如浏览器中的那些,但不是Node.JS,例如,那里没有
窗口
)。哦,是的,我忘记了Node之类的:(.我认为node使用
global
而不是window,不知道其他变量…好吧,你可以在最后一段使用中指编码标准和eval x]。+1,但我确实认为这个解决方案有点过火。你不是在创建一个全局
map
变量,而是在创建一个全局
store
变量。仅此而已在我看来,adds是一些语法上的甜点。@pimvdb是的,这有点过分了。这是这种模式的最基本形式。当get/set行为更复杂时(当必须执行多个命令时),它会变得更有用。。。