我有一个很长的绕组开关案例声明,如此
switch(x){
case "a":
// call function a
a():
break;
case "b":
// call function b
a():
break;
case "c":
// call function c
c():
break;
}
我不能简单地说
// If the x variable is set, call the corresponding function
If (x){
x();
}
它不工作的唯一原因是因为它认为im调用函数x(),但我想用x作为其他函数的占位符。这可能吗?
答案 0 :(得分:2)
创建您要调用的函数的缓存:
var fnCache = {
a: function(){},
b: function(){},
c: function(){}
};
然后在你的代码中:
// x is assigned a value somehow
var x = 'a';
// ... later ...
if (typeof fnCache[x] == 'function') {
fnCache[x]();
}
假设所有函数都是本机函数而不是宿主方法(请参阅对Mrchief帖子的评论)。
答案 1 :(得分:1)
这取决于您的功能定义的位置。如果它在全球范围内定义,您可以说:
if (window[x]) window[x]();
如果它是全局范围内的对象的一部分,请说:
var obj = function() {
this.x = function() {
// do something
};
}
然后你可以这样称呼它:
window[obj][x]();
这是为了让你入门。您应该在最终例程中添加空检查以及它是否真的是一个函数。
如果您使用jQuery,可以查看:if (jQuery.isFunction(window[x])) window[x]();
答案 2 :(得分:0)
您可以通过多种方式进行此操作,但为您提供类似于您想要的示例:
function foo(x)
{
x();
}
function bar()
{
alert('test');
}
foo(bar);
答案 3 :(得分:0)
// If the x variable is set, call the corresponding function
If (x){
x();
}
但我想使用x作为其他功能的占位符。这可能吗?
不,x
在两种情况下都是变量。 x()
不是函数名,它是函数调用,其中x
是变量而()
是实际调用。函数变量和其他变量都存储在同一个全局命名空间中,并且会相互覆盖,因此您不能使用同名的两个版本。您必须将其存储在对象中或将其称为其他内容。
您可以执行以下操作:
if (typeof x === 'function'){
x();
}