真的不清楚你当前的结构是什么 (现在你已经发布了代码更加清晰,请参阅下面的“更新”),但基本上在 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 中可以通过两种不同的方式引用:
使用点表示法和文字名称,例如container.one
, 或
在字符串中使用括号表示法和名称,例如container["one"]
.
除了属性名称的来源之外,它们完全等效。当然,在第二种情况下,属性名称不必是文字字符串,它可以是任何表达式的结果,包括变量引用(例如,您可以从 获取名称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 等动态语言。