Javascript: насколько эффективнее объявление разветвленной функции?
Запрет на любую магическую оптимизацию, выполненную с использованием JIT / времени выполнения, "вызывает" ту же стоимость при вызове любой функции. Функции - это просто объекты, которые часто хранятся в переменных (или свойствах).
Насколько более "эффективной" является версия, которая возвращает специализированный функциональный объект , зависит от факторов, включая (но не ограничиваясь ими):
- количество выполнений результирующей функции (1x = нет усиления) и
- «стоимость» ветви против другого кода (зависит) и
- «стоимость» создания указанного замыкания (очень дешево)
При дешевой ветке или малом количестве подсчетов "эффективность" уменьшается. Если есть конкретный вариант использования , тогда отметьте эталон, который , и вы получите «ответ».
Когда я вижу это, моя немедленная реакция заключается в том, что это было бы ужасно поддерживать. Код, написанный таким образом, на самом деле не может быть легко понятным.
Этот пример не обязательно делает это справедливо, ИМХО, и является грязным по другим причинам. Я думаю, что предоставление анонимной внешней функции явного имени - это можно сделать даже для выражений функций - поможет, например, лучше прояснить намерение. Сначала напишите код, который будет чистым. Затем запустите анализ производительности (бенчмарк) и исправьте при необходимости. Вероятность того, что «медленные части» не будут такими, как первоначально ожидалось.
Часть того, что «нелегко понять», является просто недостаточным знакомством с этой конструкцией (не пытаясь подразумевать здесь что-либо негативное) - с другой стороны, каждый язык, о котором я знаю, имеет особенности, которыми злоупотребляют в случаях где есть более чистые решения.
В этом случае вместо условного определения функции внутри другой функции, которая затем вызывается сразу после объявления внешней функции, можно написать функцию вложенного ifs. Это было бы дольше, но, на мой взгляд, легче понять (хотя я пришел из C / C ++ / Java).
Опять же, точный случай немного грязный, ИМХО. Тем не менее, JavaScript не C / C ++ / Java, а функции как значения первого класса и замыкания не существуют в C / C ++ / Java (это маленькая ложь, замыкания можно эмулировать в Java и новейший C ++ поддерживают некоторую форму замыканий AFAIK - но я не использую C ++).
Эта конструкция, таким образом, не видна в этих других языках, потому что другие языки не поддерживают ее легко (или вообще) - она ничего не говорит о жизнеспособности подхода (в JavaScript или где-либо еще) в общем.
Я бы предпочел ответы, которые включают номера тестов или объяснения того, как эти функции будут отличаться во время выполнения.
См. Выше.
Расширение на жирный раздел сверху:
Функция - это «просто объект», который «применяется» (читай: вызывается) с оператором (...)
.
function x () {
alert("hi")
}
x() // alerts
window.x() // alerts -- just a property (assumes global scope above)
a = {hello: x}
a.hello() // alerts (still property)
b = a.hello
b() // alerts (still just a value that can be invoked)
Удачного кодирования.