今、彼らはまったく動かない。なんで?
いくつかの理由が考えられます:
どこにも宣言されていない場合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#bind
this
呼び出されると、特定の値と指定した引数で元の関数を呼び出す関数を返します。
そうでない場合は、独自の を作成するか、次のようにすることができます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 を呼び出す関数を作成することで機能します。