Каковы соображения для / против различных стилей современных определений функций JavaScript?
Я пытаюсь решить, какой стиль использовать для определения функций уровня модуля.
Вот варианты, которые я рассмотрел:
// function expression using an arrow
const foo = (arg)=> {
// ...
};
// function expression with the `function` keyword
const bar = function(arg){
// ...
};
// function declaration
function baz(arg){
// ...
}
Я предпочитаю foo
стиль, но он кажется нестандартным. Есть ли какие-то соображения против этого, которые я не учел? Например, существуют ли значительные потери производительности при использовании выражений функций, const
или стрелки, либо изначально, либо при переносе?
Вот что у меня так далеко:
Преимущества использования const
с выражением функции вместо использования объявления функции:
- Ничто никогда не поднимается, если вы используете только
const
а такжеlet
это упрощает работу с языком. - С помощью
const
заставляет интерпретатор выдавать ошибку, если вы пытаетесь определить две функции с одним и тем же именем в одной и той же области видимости (это было удивительно полезно). - С помощью
const
позволяет вам сказать, что вы имеете в виду: большую часть времени вы хотите определить функцию, а не присвоить ее переменной. - С помощью
const
вместо объявления функции становится понятнее, что функции являются значениями в JS.
Недостатки функциональных выражений:
- Объявление функции приводит к тому, что и объявление переменной, и тело функции переносятся в верхнюю часть текущего тела функции (я думаю). На самом деле это может быть полезно, если вы хотите выложить свои файлы JS с кодом, использующим функции вверху, и определениями функций внизу.
Я не смог найти случаев, когда функциональные выражения сложнее отлаживать или где было сложнее использовать рекурсию с функциональными выражениями.
Преимущества использования стрелок вместо function
ключевое слово:
- Толстая стрела в этом смысле имеет более простую семантику. Вероятно, лучше не спрашивать новые значения
this
а такжеarguments
если они действительно не нужны.