javascript中的函数映射?
我有一个上下文菜单,可以触发不同的javascript函数。 选择函数的简单解决方案如下所示:javascript中的函数映射?,javascript,Javascript,我有一个上下文菜单,可以触发不同的javascript函数。 选择函数的简单解决方案如下所示: function(action, el, pos) { switch(action) { case "export_selected_to_excel": exportSelectedToExcel(el); break; etc.. } } function exportSelectedToE
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:如果你事先知道函数,我认为这是不必要的低效。