Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:代码优化_Javascript - Fatal编程技术网

JavaScript:代码优化

JavaScript:代码优化,javascript,Javascript,知道: var STEP = { GET_CONF: 1, CHOOSE_CREATE_CONTINUE_JOIN: 2, CHOOSE_CREATE: 3, CHOOSE_CREATE_VALIDATE: 4, CHOOSE_JOIN: 5, CHOOSE_JOIN_VALIDATE: 6, WAITING_OTHER

知道:

var STEP = {
    GET_CONF:                    1,
    CHOOSE_CREATE_CONTINUE_JOIN: 2,
    CHOOSE_CREATE:               3,
    CHOOSE_CREATE_VALIDATE:      4,
    CHOOSE_JOIN:                 5,
    CHOOSE_JOIN_VALIDATE:        6,
    WAITING_OTHER_PLAYERS:       7,
    POSITION_BOATS:              8,
    POSITION_BOATS_VALIDATE:     9,

    FIGHT_WAITING_FOR_ALL:      10,
    FIGHT_CHOOSING_A_TARGET:    11,
    FIGHT_WAITING_RESULTS:      12,

    GAME_OVER:                  13,
    ASK_RESTORE:                14
};
我要生成以下代码:

this.update = function(board) {
    var bd=board.display;
    switch(board.step) {
        case STEP.CHOOSE_CREATE_CONTINUE_JOIN:
            bd.showChooseCreateContinueJoin(bd);
            break;
        case STEP.CHOOSE_CREATE:
            bd.showChooseCreate(bd);
            break;
        case STEP.CHOOSE_JOIN:
            bd.showChooseJoin(bd);
            break;
        case STEP.WAITING_OTHER_PLAYERS:
            bd.showWaitingOtherPlayers(bd);
            break;
        case STEP.POSITION_BOATS:
            bd.showBoardPositionBoats(bd);
            break;
        case STEP.FIGHT_WAITING_FOR_ALL:
            bd.showFightWaitingForAll(bd);
            break;
        case STEP.FIGHT_CHOOSING_A_TARGET:
            bd.showFightChoosingATarget(bd);
            break;
        /* ... */
        /* ... */
        /* ... */
        default:
            /* ? should never happen */
            fatal_error('Unknown step', new Array('Fatal error'));
    }
};
到通用索引表中,类似于:

this.update = function(board) {
    if (typeof fnDisplay[board.step] != 'undefined') {
        /* do something like board.display.fnDisplay(board.display) */
    }
};

如何做到这一点?

使用以下方法:

function getFunctions(bd){
    var fn = {}
    fn[STEP.CHOOSE_CREATE_CONTINUE_JOIN] = bd.showChooseCreateContinueJoin;
    fn[STEP.CHOOSE_CREATE]               = bd.showChooseCreate;
    fn[STEP.CHOOSE_JOIN]                 = bd.showChooseJoin;
    fn[STEP.WAITING_OTHER_PLAYERS]       = bd.showWaitingOtherPlayers;
    fn[STEP.POSITION_BOATS]              = bd.showBoardPositionBoats;
    fn[STEP.FIGHT_WAITING_FOR_ALL]       = bd.showFightWaitingForAll;
    fn[STEP.FIGHT_CHOOSING_A_TARGET]     = bd.showFightChoosingATarget;
    return fn;
}
然后:

或者,为了安全起见,检查该函数是否存在,并添加您的回退:

this.update = function(board) {
    var bd=board.display;
    if(getFunctions(bd).hasOwnProperty(board.step)){
        getFunctions(bd)[board.step](bd);
    } else {
        /* ? should never happen */
        fatal_error('Unknown step', new Array('Fatal error'));
    }
};

把那个大东西放在一个函数中,并将它分配给这个。更新?你的意思是要创建一个函数数组?你到底有什么问题?@patrickhoffman如果你仔细看代码,我想制作函数和函数数组,但如果是这么简单,我不会在这里问。这比一系列代码要微妙得多,投了否决票的人从10个单词中只读了一个。那么你的问题是什么呢怎么做?'不是很具体。@PatrickHofman我想创建一个函数数组,这些函数是另一个对象的一部分。我认为您的第一段代码会给出语法错误,您可能必须使用方括号符号来填充这些函数
[]
。另外,
bd
变量是从该方法的参数创建的,因此在填充映射时使用该变量可能不安全。也许将“步骤”映射到函数名?@Pudge601:自己试试:
var a={'someString':function(){}
。不过,我确实忽略了
bd
这件事。是的,那很好,但你不是这么做的。您正在执行
var a={STEPS.SOMETHING:function(){}
。事实上,您试图使用一个变量作为键,而该变量名包含一个点。@Pudge601:我只是将函数引用存储在数组中。大写的变量似乎是静态字符串(标识符),因此可以用作键。函数引用可以用作变量。我修正了
bd.
的问题,但是用
bd
作为参数从函数中生成结果。@Pudge601:哦,我明白你的意思了,是的,点符号是个问题。。。我会想办法的。
this.update = function(board) {
    var bd=board.display;
    if(getFunctions(bd).hasOwnProperty(board.step)){
        getFunctions(bd)[board.step](bd);
    } else {
        /* ? should never happen */
        fatal_error('Unknown step', new Array('Fatal error'));
    }
};