2013-04-02 2 views
1

Представьте себе задачу, в которой есть массив ресурсов, которые имеют свойство type. Основываясь на этом type, необходимо выполнить различные функции. Один из способов реализовать это - через несколько условий if/else или switch/case.Какая из них более эффективна для поддержания: ссылки на функции JavaScript или условия Boolean + IF?

// at run time (run many times) 
if (resources[ix].type == 'TYPE_ONE') { 
    runFuctionOne(); 
} 
else{ 
    runFuctionTwo(); 
} 

Другой способ заключается в сохранении еще одно свойство, как execute, которая будет назначена функция, которая удовлетворяла бы ресурса type. Тогда вам не нужно если/другое условия и может выполнять свою функцию непосредственно как:

// at assign time (run once) 
if (resources[ix].type == 'TYPE_ONE') { 
    resources[ix].execute = runFunctionOne; 
} 
else{ 
    resources[ix].execute = runFuctionTwo; 
} 

// then at run time (run many times) 
resources[ix].execute(); 

Итак, , какой путь будет более эффективным? Есть ли способ лучше?

Редактировать: Меня больше интересует решение, эффективное в среде Node.js, а не в среде браузера.

+0

ли эта проблема причина? – OQJF

+0

Какую проблему вы имеете в виду? – Eye

+1

Я создал jsperf http://jsperf.com/javascript-function-references-vs-boolean-if-conditions, который показывает, что ссылки в браузерах работают быстрее. Однако сценарий Node.js сообщает об обратном: if/else в 3 раза быстрее, чем ссылки на функции. – Eye

ответ

2

Я думаю, что карта функций будет лучшим вариантом здесь.

Определить глобальную карту

var fns = { 
    'TYPE_ONE' : runFunctionOne, 
    'TYPE_TWO' : runFunctionTwo 
}; 

затем использовать его

var fn = fns[resources[ix].type]; 
if (typeof fn == 'function') { 
    fn() 
} 

Или использовать switch

var fn; 
switch (resources[ix].type) { 
    case "TYPE_ONE" : 
     fn = runFunctionOne; 
     break; 
    case '' : 
     // execute code block 2 
     break; 
    default : 
     // 
} 

fn() 
+0

Ссылки на функции, основанные на свойствах, работают немного быстрее. См. Http://jsperf.com/javascript-function-references-vs-boolean-if-conditions. – Eye

+0

@ Eye yes Если это зависит от меня в сценарии браузера, я пойду с первым подходом –

Смежные вопросы