我有一个全局变量,如下所示:
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”不应该用于此,但这只是为了说明。
修改
感谢大家的答复,但它不起作用。
这是我到目前为止我的全局变量(它的工作原理但我不想将php与javascript混合):
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 );
所以我在这里遇到了两个问题:
我可以避免使用eval,但我只是不知道如何。
PS:我在这里处于全球范围内。
答案 0 :(得分:4)
window['socket_'+userId] = "whatever";
这应该工作得很好。不要将eval
用于像这样简单的事情。
虽然,更好的是阵列:
socket[userId] = "whatever";
答案 1 :(得分:1)
附加到window
的变量是全局变量。例如:
var myVar = 'hello';
alert( window.myVar );
...会提醒'你好'(假设这段代码在全局范围内运行)。
编辑:我会尝试通过window
而不是window[xxx] = yyy
手动指定变量来确保您的变量附加到var xxx = yyy
对象。这意味着它即使在函数调用中也会一直有效。尝试使用这个小提琴,看看你是否可以像真实代码一样打破它:http://jsfiddle.net/2hYfa/