Comments 7
del
Например, нам нужно написать декорирующую функцию, которая будет считать количество вызовов какой-то функции. Это можно сделать весьма изящно с помощью 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 */ };
}
Это уже другая тема )
Sign up to leave a comment.
Красота НЕ-безымянных функций в JavaScript