Как стать автором
Обновить

Комментарии 7

Например, нам нужно написать декорирующую функцию, которая будет считать количество вызовов какой-то функции. Это можно сделать весьма изящно с помощью NFE.

На мой взгляд, плохой пример — тут лучше подойдет замыкание. Поля вашей функции могут быть изменены извне:
const count = f => function df() {
    df.calls = (df.calls || 0) + 1;
    return f(...arguments);
};

const foo = count(console.log);
foo.calls = 100;
...
Да, в случае с замыканием нам потребуется вернуть объект-контейнер: вызываемая функция + геттер для получения количества обращений. Настоящий пример демонстрирует работу с функцией внутри NFE как с объектом. JavaScript позволяет решить простую задачу, избегая лишнего кода.

Повторюсь, что подобное обращение с функцией в поставляемом коде — недопустимо. Но для локальных задач сгодится на отлично.
В чем преимущество назначать константе функциональное выражение, пусть даже это именованная функция? Почему не делать это по-старому:
export function foo() {}

?

В примере с числами Фибоначчи. Если мы захотим перенести функцию в другую переменную, то есть:


let rf2 = rf;
rf = null;

В случае с декларированием функции (FunctionDeclaration), мы получим ошибку. Так как внутри функция будет вызывать себя по старому имени. Такая защита.


Ну а сам FunctionExpression полезен например при условном объявлении функции, так как такая функция создается в процессе выполнения выражения:


let fe;
if (cond) {
    fe = function() { /* 1 */ };
} else {
    fe = function() { /* 2 */ };
}

Это уже другая тема )

Это надуманный пример из разряда олимпиадных задач. В 95% случаях делать такого не требуется.
Конечно, это Ненормальное программирование ) в то же время — особенности языка.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории