当前位置:  开发笔记 > 编程语言 > 正文

如何避免嵌套切换?

如何解决《如何避免嵌套切换?》经验,为你挑选了1个好方法。

我正在使用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);
        }

呸.必须有一个更好的方法.也许调度员比它的价值更麻烦.我已经看了一些的 相关 帖子,但我不是很了解有将它们应用到这个确切情况.



1> Miles..:

在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建议的那样.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有