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'));
}
};