Javascript:动态命名的全局变量

Bay*_*ock 5 javascript global-variables dynamic-data

我有一个看起来像这样的全局变量:

var socket_x = 'whatever';
Run Code Online (Sandbox Code Playgroud)

问题是“x”将取决于用户会话。假设用户 ID 为 123,我希望全局变量为:

var socket_123 = 'whatever';
Run Code Online (Sandbox Code Playgroud)

这样,每个浏览的用户都会将自己的套接字设置为全局变量。

我只是不知道该怎么做。

我知道我可以使用:

eval('socket_' + userId)   = 'whatever'; //not recommended
window['socket_' + userId] = 'whatever'; //best
Run Code Online (Sandbox Code Playgroud)

但是如果我想像这样声明全局变量,它将不起作用:

var eval('socket_' + userId) = 'whatever';
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?

谢谢你。

PS:我知道不应该使用“eval”,但这只是为了说明。


编辑:

谢谢你们所有人的回答,但它不起作用。

到目前为止,这是我的全局变量(它可以正常工作,但我不想将 php 与 javascript 混合使用):

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

如果我这样做,就像你建议的那样:

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

它只是行不通。

如果我将其作为局部变量来执行,它会起作用:

eval('socket_'+actual_user_id).emit( 'all', msg_all );
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,它不会:

window['socket_'+actual_user_id].emit( 'all', msg_all );
Run Code Online (Sandbox Code Playgroud)

所以我在这里遇到了两个问题:

  • window 从来不适合我,eval 可以。
  • eval 作为一个局部变量而不是一个全局变量。似乎需要“var”,但不接受在 eval 之前使用“var”。

我可以避免 eval 但我只是不知道如何。

PS:我在这里处于全球范围内。

Nie*_*sol 5

window['socket_'+userId] = "whatever";
Run Code Online (Sandbox Code Playgroud)

那应该工作得很好。不要eval用于像这样微不足道的事情。

虽然,更好的是数组:

socket[userId] = "whatever";
Run Code Online (Sandbox Code Playgroud)