javascript中的函数映射?

javascript中的函数映射?,javascript,Javascript,我有一个上下文菜单,可以触发不同的javascript函数。 选择函数的简单解决方案如下所示: function(action, el, pos) { switch(action) { case "export_selected_to_excel": exportSelectedToExcel(el); break; etc.. } } function exportSelectedToE

我有一个上下文菜单,可以触发不同的javascript函数。 选择函数的简单解决方案如下所示:

function(action, el, pos) {
    switch(action)
    {
        case "export_selected_to_excel":
            exportSelectedToExcel(el);
            break;

        etc..
    }
}
function exportSelectedToExcel(id){
   //stuff...
}

var menuAction = new Array();
menuAction["export_selected_to_excel"] = exportSelectedToExcel;
我希望有一个函数图,这样我可以将metod简化为类似于以下内容:

function(action, el, pos) {
    menuAction[action](el);
}
我这样定义数组:

function(action, el, pos) {
    switch(action)
    {
        case "export_selected_to_excel":
            exportSelectedToExcel(el);
            break;

        etc..
    }
}
function exportSelectedToExcel(id){
   //stuff...
}

var menuAction = new Array();
menuAction["export_selected_to_excel"] = exportSelectedToExcel;
这似乎很好,感觉是一个合理的解决方案

在javascript中这样做有什么缺点吗?

还有更好的方法吗?

如果您这样做,函数将指向另一个函数,从而产生一些开销,您也可以直接在对象内部定义函数,例如:

var menuAction = {};
menuAction.export_selected_to_excel = function (id) {
    // stuff
}
为了确保函数存在,您可以执行以下操作:

var action = 'export_selected_to_excel';
if(typeof menuAction[action] == 'function')
{
    // call function
}

我不认为有什么大的缺点。 事实上,当您定义一个对象并在函数内部声明时,您试图做的与您所做的相似

e、 g:


唯一的区别是,在这种情况下,您不是在对象声明中定义函数,而是使用关联数组表示法定义后验函数。

如果函数的名称确实可以直接从字符串派生,例如

export_selected_to_excel   => exportSelectedToExcel
compute_selected           => computeSelected
...
…然后,您可以动态生成fn名称并动态调用它们,而不是使用关联数组

使用此问题的答案()转换名称


然后,使用这个问题的答案()调用该函数。确保验证
window[functionName]
是否为实际函数,测试类型为
test

您的想法很好,但不应将数组用作关联贴图,因为它们不是关联的(请参见示例)。当您执行
var a=[]时;a[“x”]=y
您实际上将属性
x
指定给对象a。因此,它在后面成立:
a.length==0和a.x==y

您只需按对象替换
数组
,即可获得关联贴图:

var menuAction = {};
menuAction["export_selected_to_excel"] = exportSelectedToExcel;
// or
menuAction.export_selected_to_excel = exportSelectedToExcel;
// or
menuAction.export_selected_to_excel = function(id) {...};
或:


这个定义是按字面意思复制的,还是像我这样引用函数的?它是完全合法的,我在代码中使用相同的逻辑。没有函数不会“存在两次”,你只有函数和指向它的指针。实际上,我可以为任何东西命名字符串和函数。很酷的解决方案,但开销似乎有点不必要。我喜欢它,但我不认为它值得。@Cheeso:如果你事先知道函数,我认为这是不必要的低效。