今、彼らはまったく動かない。なんで?
いくつかの理由が考えられます:
どこにも宣言されていない場合NPCid: あなたのコードはReferenceError.
NPCidがどこかで宣言されているがグローバルではない場合: 文字列を に渡すとsetTimeout、現在の実行コンテキストで評価されず、 にアクセスできませんNPCid。一般に、文字列を に渡さないでくださいsetTimeout。
がグローバルの場合NPCid: 遅延コードが実行されると、ループの最後NPCidの値であるに対してすべて同じ値が表示されます。
代わりに: NodeJS でこれを行っている場合 (私はあなたがしていることからこれを推測しているだけです)、これを行うことができます):
PS.Tick = function ()
{
"use strict";
// (I'm assuming NPCid is defined somewhere; if not, add `var NPCid;` here)
for (NPCid = 0; NPCid < NPCnumber; NPCid++)
{
var timeout = 0;
timeout = PS.Random (1000);
setTimeout(NPCAI, timeout, NPCid); // NodeJS (and Firefox) ONLY!!
}
};
NodeJS (および Firefox) では、setTimeout呼び出す関数に渡す引数を受け入れることができるため、これは機能します。
NodeJS または Firefox を使用していないが、ES5 のFunction#bindにアクセスできる場合は、次のようにすることができます。
PS.Tick = function ()
{
"use strict";
// (I'm assuming NPCid is defined somewhere; if not, add `var NPCid;` here)
for (NPCid = 0; NPCid < NPCnumber; NPCid++)
{
var timeout = 0;
timeout = PS.Random (1000);
setTimeout(NPCAI.bind(undefined, NPCid), timeout);
}
};
Function#bindthis呼び出されると、特定の値と指定した引数で元の関数を呼び出す関数を返します。
そうでない場合は、独自の を作成するか、次のようにすることができますbind。
PS.Tick = function ()
{
"use strict";
// (I'm assuming NPCid is defined somewhere; if not, add `var NPCid;` here)
for (NPCid = 0; NPCid < NPCnumber; NPCid++)
{
var timeout = 0;
timeout = PS.Random (1000);
setTimeout(makeHandler(NPCid), timeout);
}
function makeHandler(id) {
return function() {
NPCAI(id);
};
}
};
これは、呼び出されたときに向きを変えて、渡した値で NPCAI を呼び出す関数を作成することで機能します。