【发布时间】:2012-05-14 16:44:44
【问题描述】:
我有一个看起来像这样的全局变量:
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 );
所以我在这里遇到了两个问题:
- window 从不适合我,eval 可以。
- eval 作为局部变量而不是全局变量。似乎需要“var”,但不接受在 eval 之前使用“var”。
我可以避免 eval,但我不知道怎么做。
PS:我在这里是在全球范围内。
【问题讨论】:
-
这段代码是否在浏览器中运行?您可以在
eval中包含var我不推荐它。eval('var socket_' + userId + ' = "whatever"'); -
为什么在编辑的第二个代码块中使用
==比较?您的意思是使用分配吗? -
另外,听起来你真的应该使用对象。
var sockets = {};然后添加每个用户的socket:socket['socket_' + userId] = "whatever"; -
这里的“==”是一个错字,不在我的脚本中(我在我的问题上更正了它)。对于对象,我使用的是“PubNub”,这是他们推荐的调用库的语法。我试过你的方法,但不被接受。
-
你能确认
eval("socket_"+actual_user_id) !== window["socket_"+actual_user_id]吗?如果是这样,您的范围问题会导致eval中的变量名称引用非全局变量。
标签: javascript global-variables dynamic-data