2011-12-25 38 views
6

可能重複時間:
Javascript dynamic variable name創建一個新的獨特的全局變量每一個函數在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 named var2347 that equals something, but the above line doesn't get it. 
} 

在後面的功能,我想訪問變量,像這樣:

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

我敢肯定,我將有一個「衛生署!」當有人善意回答這個問題時。

+0

你想一個新的全局變量或只是現有的全局變量'id'有新的價值? – 2011-12-25 15:18:00

+0

你想*避免*全局變量。創建你自己的命名空間,而不是... – 2011-12-25 15:24:31

+0

只是使它成爲一個數組並寫入變量[12345]而不是vars12345。 – Kos 2011-12-25 15:49:15

回答

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/

程序員高度宜聲明全局變量,因爲瀏覽器已經在全局名稱空間中提供了數百個名稱。將全局命名空間用於自己的變量可能會導致名稱衝突,然後可能會破壞程序或某些瀏覽器的功能。創建新的命名空間是免費的,所以不要害羞做它...

+0

+ 1的最後一段,但我確實認爲這個解決方案有點矯枉過正,而不是全局的'map'變量,你正在創建一個全局'store'變量,這個增加的僅僅是我認爲的一些語法糖。 – pimvdb 2011-12-25 16:03:01

+0

@pimvdb是的,它是一種矯枉過正的方式,這是這種模式最基本的形式,當get/set行爲更復雜時(當需要執行多個命令時),它變得更有用...... – 2011-12-25 20:43:24

3

您可以將值保存到全局散列:

var g = {}; 

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

function two (id) 
{ 
    alert(g[id]); 
} 
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]); 
} 
+0

我相信這隻適用於一些JS實現(如瀏覽器中的那些,但不包括Node.JS),那裏沒有'window'。 – Kos 2011-12-25 15:47:41

+0

噢,是的,我忘了節點和這樣的:(我認爲節點使用'全局'而不是窗口,不知道其他人......以及你可以中指編碼標準和eval x – 2011-12-25 15:52:12

2

我會爭辯說,你不是真的想做很多全局變量。相反,您可以創建一個全局對象或數組,並將所有其他變量添加到該對象或數組中。在這種情況下,你可能需要一個對象:

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); 
相關問題