我正在使用JavaScript为Web应用程序创建上下文菜单.菜单可以出现在许多上下文中,并且有不同的选择.我可以为每个上下文/选择使用不同的函数:
grid1_delete() grid1_duplicate() grid2_delete() grid2_add() grid2_duplicate()
正在构建菜单时硬编码.我不喜欢的事情可能是会有很多重复的代码.所以我在考虑使用调度程序函数,但这会导致可能很长的嵌套switch语句:
function contextMenuClick(context, menuItem) { var action = menuItem.innerHTML; switch (context) { case 'grid1': switch(action) { case('delete'): // do delete for grid1 break; case('duplicate'): // do duplicate for grid1 break; default: console.log('undefined action in contextMenuClick/grid1: ' + context); } break; case 'grid2': switch(action) { case('add'): // do add for grid2 break; case('delete'): // do delete for grid2 break; case('duplicate'): // do duplicate for grid2 break; default: console.log('undefined action in contextMenuClick/grid2: ' + context); } break; default: console.log('undefined context in contextMenuClick: ' + context); }
呸.必须有一个更好的方法.也许调度员比它的价值更麻烦.我已经看了一些的 相关 帖子,但我不是很了解有将它们应用到这个确切情况.
在Javascript中很少需要切换语句.通常,您可以只使用字典/地图等对象并直接进行查找:foo.bar
相当于foo['bar']
.
此外,对于"全局"变量,some_global_func()
就相当于window.some_global_func()
,这也可以写成var f = 'some_global_func'; window[f]()
:你不以往任何时候都需要eval
,以选择一个变量或动态调用基于其名称的函数.通常,在执行此操作时,您应该更喜欢将函数存储在对象中而不是存储在全局范围内(即在window
对象中).
因此,假设grid1_delete
并且grid2_delete
根本不同并且不能组合成通用函数,您可以执行类似下面的操作而不需要更改代码:
var grid_actions = { 'grid1': { 'delete': function() { /* ... */ }, 'duplicate': function() { /* ... */ } }, 'grid2': { 'delete': function() { /* ... */ }, 'add': function() { /* ... */ }, 'duplicate': function() { /* ... */ } } } function contextMenuClick(context, menuItem) { var action = menuItem.innerHtml; if (context in grid_actions) { if (action in grid_actions[context]) { grid_actions[context][action](); } else { console.log('undefined action in contextMenuClick/' + context + ': ' + action); } } else { console.log('undefined context in contextMenuClick: ' + context); } }
但是,更好的解决方案是重构事物,使这些函数成为每个上下文的对象方法,如@ le dorfier建议的那样.