現在の構造が何であるかは本当に不明です (コードを投稿したので、より明確になりました。以下の「更新」を参照してください)が、基本的にJavaScriptでこの種のことを行う方法は、コンテナーオブジェクトを用意することです。(まだ持っていない場合は、導入してください。)次にslot
、次のように、そのオブジェクトのプロパティを参照できます。
var container = {
one: "This is one",
two: "This is two"
};
// ...
function foo(slot) {
console.log(container[slot]);
}
// ...
foo("one"); // ends up logging "This is one"
foo("two"); // ends up logging "This is two"
これが機能するのは、コンテナオブジェクトにプロパティがあり、JavaScriptでは次の2つの方法で参照できるためです。
ドット表記とリテラル名を使用します。例:container.one
、または
文字列に括弧で囲まれた表記と名前を使用しますcontainer["one"]
。例:
プロパティ名の由来を除いて、これらはまったく同じです。そしてもちろん、2番目のケースでは、プロパティ名はリテラル文字列である必要はありません。変数参照を含む任意の式の結果である可能性があります(たとえば、から名前を取得できますslot
)。
これは、関数を参照するプロパティを含む、すべてのオブジェクトプロパティで機能します。私はあなたがあなたの質問で関数に言及したという理由だけでこれに言及します、それであなたがそうする必要があるならば、あなたはこれをすることができます:
function foo(slot) {
container[slot]();
}
...これはcontainer
、引数によって保持されている名前でそのプロパティの関数を呼び出しslot
ます。したがって、の場合、それは行いslot
ます。"one"
container.one()
更新:
ソースは上記のコンテナの例を直接エコーします。上記を適用するだけです。
function disableActionButton(slot){
$("#"+slot).attr("disabled","disabled")
// ---------v----v---- here
gcd = player[slot].gcd*1000
cd = setInterval(function(){
gcd = gcd - 10
$("#"+slot).val(gcd+"ms").css("color","red");
},10)
setTimeout(function(){
window.clearInterval(cd)
// ------------------------------------------------------------ and here--v----v
$("#"+slot).removeAttr("disabled").css("color","black").val(player[slot].name);
// ------v----v------- and here
}, player[slot].gcd*1000)
}
または、スロットデータを毎回検索するのではなく、一度取得して再利用します。
function disableActionButton(slot){
// Grab it once...
var slotdata = player[slot];
$("#"+slot).attr("disabled","disabled")
// ---vvvvvvvvv--- then use it
gcd = slotdata.gcd*1000
cd = setInterval(function(){
gcd = gcd - 10
$("#"+slot).val(gcd+"ms").css("color","red");
},10)
setTimeout(function(){
window.clearInterval(cd)
$("#"+slot).removeAttr("disabled").css("color","black").val(slotdata.name);
}, slotdata.gcd*1000)
}
これには特別な名前はありません。プロパティ名を関数に渡しており、関数はplayer
その名前を使用してオブジェクトのプロパティを検索しています。他のいくつかの言語では、これは「リフレクション」と呼ばれることがありますが、この用語はJavaScriptのような動的言語には実際には適用されません。