Операторы Switch очень редко необходимы в 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 .