【问题标题】:Javascript: dynamically named global variableJavascript:动态命名的全局变量
【发布时间】: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


【解决方案1】:
window['socket_'+userId] = "whatever";

这应该可以正常工作。不要将eval 用于此类琐碎的事情。

虽然,更好的是数组:

socket[userId] = "whatever";

【讨论】:

  • 谢谢。请阅读我的第一个问题,因为我对其进行了更准确的编辑。
  • 嗯...在同一个浏览器窗口上会不会有多个用户?如果没有,为什么不直接调用变量session 并忘记上面有用户ID?
  • 没有。仅限一名用户。但我只是不明白你所说的可变会话。用户 id 变量是我通过 ajax 获得的变量 session。如您所见,使用 php 变量效果很好,我只是更喜欢使用 javascript 变量以避免在同一脚本中混合 php 和 javascript。
  • 完成我的回答:我的脚本按原样工作,但我想摆脱脚本中的 php 变量的原因是它是唯一阻止我调用我的文件的原因 'javascript .js' 而不是 'javascript.php'。没什么大不了的,但是因为我找不到正确声明变量的方法,所以让它很难过。
  • 我个人喜欢在我的页面顶部包含一个小脚本,其中包含USERNAME="&lt;?=$username?&gt;" 等内容,然后让外部脚本引用这些全局变量。
【解决方案2】:

附加到window 的变量全局变量。例如:

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

... 会提示 'hello'(当然,假设此代码在全局上下文中运行)。

编辑:我会尝试通过使用window[xxx] = yyy 而不是var xxx = yyy 手动指定变量来确保将您的变量附加到window 对象。这意味着即使它在函数调用中也将始终有效。试试这个小提琴,看看你能不能像你的真实代码一样破解它:http://jsfiddle.net/2hYfa/

【讨论】:

  • 谢谢。请阅读我的第一个问题,因为我对其进行了更准确的编辑。
  • 我对你所说的没意见,但正如你在我编辑的问题中看到的那样,它对我不起作用。
  • 好的,我试过了,这就是我得到的 => 如果我尝试在 div 上显示它,就像你在 jsfiddle 上所做的那样;什么都没有显示。如果我尝试使用 console.log 或 alert 函数,我会得到:[object object]。感谢您的帮助。
  • 那似乎可行。为简单起见,我的示例使用了字符串,但您使用的是对象。如果警报显示对象 Object,那么它可能是正确的对象。
  • 可能。但似乎这个变量应该声明为“var”。我非常彻底地阅读了你之前所说的关于窗口和全局变量的内容,我明白了。但它仍然不想工作。我编辑的问题显示我按照你的建议做了,但我的聊天(这就是它的目的)从那时起就被冻结了。
猜你喜欢
  • 2017-01-04
  • 2015-04-22
  • 2013-03-25
  • 2019-10-03
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多