Javascriptでは、switch文はほとんど必要ありません。一般的には、辞書や地図などのオブジェクトを使用して直接検索することができます。foo.bar
はfoo['bar']
に相当します。 「グローバル」変数のためのまた
、some_global_func()
もvar f = 'some_global_func'; window[f]()
のように書くことができwindow.some_global_func()
、と同等です:あなたは今まで変数を選択するか、動的にその名前に基づいて関数を呼び出すためにeval
を必要としません。ただし、一般的には、グローバルスコープではなくオブジェクト(つまりwindow
オブジェクト)に関数を格納する方がよいでしょう。しかし、
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);
}
}
よりよい解決策を:
ので、grid1_delete
とgrid2_delete
は根本的に異なっており、一般的な機能に組み合わせることができないと仮定して、あなたは非常にあなたのコードを変更せずに、次のような何かを行うことができますこれらの機能が@le dorfierのように、各コンテキストのオブジェクトのメソッドになるようにリファクタリングすることです。
異なるグリッドが異なる機能をサポートしているか、それらがすべて同じセットをサポートしていますか? –
grid1_deleteとgrid2_deleteの違いがわかりません。彼らは別のオブジェクトで同じことをしますか?あるいは、彼らは根本的に異なることをしますか?前者の場合は、それらを1つの汎用関数に結合する必要があります。 – Miles
異なるグリッドは異なる機能をサポートします。さらに悪いことに、同じグリッドの異なる行は異なる機能、および/または異なるタイプのオブジェクトに作用する同様の機能をサポートします。理論的には、いくつかのリファクタリング/パラメタライゼーションが発生する可能性がありますが、すべてのケースでそうでない場合もあります。 – sprugman