javascript中的函数映射?

Car*_*l R 9 javascript

我有一个上下文菜单,将触发不同的JavaScript函数.选择函数的天真解决方案如下所示:

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

        etc..
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望有一个函数映射,以便我可以将metod减少到与此类似的东西:

function(action, el, pos) {
    menuAction[action](el);
}
Run Code Online (Sandbox Code Playgroud)

我像这样定义数组:

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

var menuAction = new Array();
menuAction["export_selected_to_excel"] = exportSelectedToExcel;
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,感觉像一个合理的解决方案.

在javascript中有这样的缺点吗?
还有更好的方法吗?

Jir*_*riz 5

你的想法很好,但你不应该使用数组作为关联映射,因为它们不是关联的(参见例如Mastering Javascript Arrays)。当您这样做时,var a = []; a["x"] = y您实际上将该属性分配x给了对象 a。所以,事后成立:a.length == 0 and a.x == y.

您应该只用Array对象替换以获得关联映射:

var menuAction = {};
menuAction["export_selected_to_excel"] = exportSelectedToExcel;
// or
menuAction.export_selected_to_excel = exportSelectedToExcel;
// or
menuAction.export_selected_to_excel = function(id) {...};
Run Code Online (Sandbox Code Playgroud)

或者:

var menuAction = {
    export_selected_to_excel: exportSelectedToExcel,
    export_x: exportX   // etc
}
Run Code Online (Sandbox Code Playgroud)