5

次のようなグローバル変数があります。

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 );

だから私はここで2つの問題を抱えています:

  • windowは私には機能しませんが、evalは機能します。
  • evalはローカル変数として機能しますが、グローバル変数としては機能しません。「var」が必要なようですが、evalの直前に「var」を使用することはできません。

評価を避けても大丈夫ですが、方法がわかりません。

PS:私はここでグローバルな文脈にいます。

4

2 に答える 2

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

それはうまくいくはずです。evalこれほど些細なことには使用しないでください。

ただし、配列の方がさらに良いでしょう。

socket[userId] = "whatever";
于 2012-05-14T16:47:03.490 に答える
1

アタッチされた変数window グローバル変数です。例えば:

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

... 'hello' というアラートが表示されます (もちろん、このコードがグローバル コンテキストで実行されると仮定します)。

編集:の代わりにwindow手動で指定することにより、変数がオブジェクトにアタッチされていることを確認します。これは、関数呼び出しであっても常に機能することを意味します。このフィドルを試してみて、実際のコードと同じように壊れるかどうかを確認してください: http://jsfiddle.net/2hYfa/window[xxx] = yyyvar xxx = yyy

于 2012-05-14T16:47:48.740 に答える