この種の接続を維持する標準的な方法は、クロージャーを使用することです。
たとえば、次のように書くと
function make_timer()
{
var x = document.createElement("div");
var count = 0;
setInterval(function(){
count += 1;
x.textContent = count;
}, 1000);
return x;
}
を呼び出すたびmake_timer
に、コンテンツが毎秒インクリメントされる独立した DOM ノードが作成されます。しかし、タイマー コールバックはどのノードがインクリメントされる必要があるかをどのように記憶できるでしょうか? 答えは、実際に に渡されるsetInterval
のは関数ではなくクロージャ、つまり関数といくつかの変数 (この場合はcount
と) であるということです。x
Java や C++ などの言語にはこの概念はありませんが、それは作成される関数であり、ローカル変数が外側のスコープからのものである場合は「キャプチャ」すると言われ、外側のスコープであってもそれらを「生きたまま」にします。それらを作成した関数は終了します (つまり、関数make_counter
が終了するとき)。
まったく同じことが ajax リクエストにも使用できます。通常は、リクエストを送信する関数にウィンドウ オブジェクトを渡すだけで、コールバッククロージャーが完了およびエラー コールバックとして使用されます。クロージャーは、サーバーから応答が返ってきたときに、それぞれのウィンドウ オブジェクトにアクセスできます。
編集
本当に s を使用したい場合ID
は、もちろんできます...あなたの例では、それらは配列に格納されているため、正確なものを探すために配列をトラバースする必要がありますID
...
var windowid=$("#guiid").val();
for (var i=0; i<window_manager.windows.length; i++)
if (window_manager.windows[i].id == windowid)
window_manager.windows[i].gui();
配列の代わりにオブジェクトを使用する方が良いでしょう。その場合、検索は次のように 1 つに減らすことができるからです。
var windowid=$("#guiid").val();
window_manager.windows[windowid].gui();
ただし、多くの場合、Javascript では数値 ID は必要ありません。これは、ウィンドウ ID を格納する代わりに、ウィンドウ オブジェクト自体への参照を格納できるためです。また、コールバックの場合、コンテキストを提供するための複雑な機構は必要ありません (クロージャーがあるため、C++ または Java で必要です)。