2012-05-14 62 views
3

我有一個全局變量,它是這樣的:的Javascript:動態命名的全局變量

var socket_x = 'whatever'; 

的事情是,「X」將取決於用戶會話。比方說,用戶ID是123,我想全局變量是:

var socket_123 = 'whatever'; 

這樣,每個用戶的瀏覽都會有他自己的插槽設置爲全局變量。

我只是不知道如何做到這一點。

我知道我可以使用:

eval('socket_' + userId) = 'whatever'; //not recommended 
window['socket_' + userId] = 'whatever'; //best 

,但如果我想聲明像這樣的全局變量,它不會工作:

var eval('socket_' + userId) = 'whatever'; 

有人可以幫助我在這一個?

謝謝。

PS:我不知道應該用於這種「EVAL」,但它只是爲了說明的緣故。


編輯:

謝謝您的回答,在座的各位,但它只是不工作。

這是我到目前爲止有我的全局變量(它的工作原理,因爲它是,但我不想混用JavaScript PHP):

var socket_<?php echo $_SESSION['user_id'];?> = io.connect('http://pubsub.pubnub.com', pubnub_setup_private); 

如果我這樣做,而不是像你建議:

window['socket_'+actual_user_id]= io.connect('http://pubsub.pubnub.com', pubnub_setup_private); 

它只是不會工作。

如果我這樣做是一個局部變量,它的工作原理:

eval('socket_'+actual_user_id).emit('all', msg_all); 

但如果我這樣做,它不會:

window['socket_'+actual_user_id].emit('all', msg_all); 

所以我得到了2個問題在這裏:

  • 窗口從來沒有對我的作品,EVAL做。
  • EVAL作品作爲一個局部變量而不是作爲一個全球性。似乎需要「var」,但在eval未被接受之前使用「var」。

我確定以避免EVAL,但我就是不知道怎麼辦。

PS:我在這裏全球範圍內。

+0

在瀏覽器中運行該代碼?你可以在''eval''中加入'var' *不是我推薦的*。 '的eval(「變種socket_」 +用戶id +「=‘無所謂’」);' –

+0

爲什麼要使用在你的編輯,你第二個代碼塊中的''==比較?你的意思是使用任務嗎? – apsillers

+1

另外,它聽起來像你應該使用一個對象。 'VAR插座= {};'然後每個用戶的插座補充說:'插座[「socket_」 +用戶id =「無所謂」;' –

回答

4
window['socket_'+userId] = "whatever"; 

這應該工作得很好。不要使用eval作爲這樣微不足道的東西。

雖然,甚至更好是一個磁盤陣列:

socket[userId] = "whatever"; 
+0

謝謝。請閱讀我的第一個問題,因爲我編輯它更準確。 – Baylock

+1

嗯......在同一個*瀏覽器窗口中會有多個用戶嗎?如果不是,那麼爲什麼不只是調用變量'session'而忘記擁有用戶ID呢? –

+0

僅限一位用戶。但我只是不明白你所說的變量會話。用戶id變量是我通過ajax獲得的變量會話。正如你所看到的,使用php變量工作得很好,我只是喜歡使用一個JavaScript變量,以避免在同一個腳本中混合使用php和javascript。 – Baylock

1

附接到window變量是全局變量。例如:

var myVar = 'hello'; 
alert(window.myVar); 

...會提醒「你好」(假設這段代碼是在全球範圍內運行,當然)。

編輯:我會嘗試通過window[xxx] = yyy而不是var xxx = yyy手動指定它來確保將變量附加到window對象。這意味着它即使在函數調用中也會一直工作。試試這個小提琴演奏,看你是否能以同樣的方式打破它作爲你的真實代碼:http://jsfiddle.net/2hYfa/

+0

謝謝。請閱讀我的第一個問題,因爲我編輯它更準確。 – Baylock

+0

我對你說的沒問題,但正如你可以在我編輯的問題上看到的那樣,它對我來說不起作用。 – Baylock

+0

好的,我編輯了我的答案與一些東西,供您嘗試。 –