Комментарии 45
Стрелочные функции (Arrow functions) в ECMAScript 6 — и название такое же, и тема раскрыта полнее.
Вы бы поделились с silmarilion'ом и дали ему хоть один совместный перевод от своего имени опубликовать. Хотел Вашего соавтора плюсануть на Мегамозге, а у него там нет ни одной публикации. Здесь он вообще ридонли.
Мне одному режет глаз фраза «Каждый раз, когда вам надо вызвать функцию, вам необходимо прописать function () {}.»?
Имплицитный возврат — насколько часто встречающийся термин? Он действительно лучше, чем тот же «неявный»?
Ещё одна статья про arrow functions в ES6? Надо прочитать, тема сложная.
Узнал для себя что
1) С {} неявного возврата не будет
2) Чтоб вернуть пустой объект, оборачиваем в ({})
3) У стрелочных функций нет arguments, а достать их можно через ...args
спасибо
1) С {} неявного возврата не будет
2) Чтоб вернуть пустой объект, оборачиваем в ({})
3) У стрелочных функций нет arguments, а достать их можно через ...args
спасибо
Мелкие функции-однострочники приветствую, а вот за использование => в больших многострочных функциях отбивал бы руки.
И что тут не так?
passport.deserializeUser((id, done) => {
User.findOne({
where: {id}
}).then((user) => {
done(null, user);
}).catch(done);
});
Слово function хорошо бросается в глаза и сразу дает понять, что это самостоятельный логический кирпич кода.
А тут — фрагмент, как будто вырванный из контекста. Стрелка видна плохо, всё сливается. То ли функция, то ли длинный цепной вызов.
Для мелких коллбеков это плюс, для самостоятельных функций — минус.
А тут — фрагмент, как будто вырванный из контекста. Стрелка видна плохо, всё сливается. То ли функция, то ли длинный цепной вызов.
Для мелких коллбеков это плюс, для самостоятельных функций — минус.
C подсветкой все нормально. Ни разу не было проблем, почти год уже с ES6.
Не нормально. И именно поэтому я не перевариваю кофескрипт, там всё ещё в разы хуже (хотя и признаю, что в нем есть некоторые интересные фишки).
Нормально
Сравнения ради примерно так выглядит похожий код в CS
ST3
Почти полное отсутствие скобок (как круглых, так и фигурных), давая смешную экономию на количестве символов, убивает читаемость на корню. Я вынужден всматриваться в строку, чтобы для начала понять, а где тут вообще что? Работать парсером, фактически. Где ключевое слово, где имя функции, где параметр, где переменные? И даже подсветка не спасает.
С точки зрения людей пишущих на CS отсутствие лишних символов и пустых слов (типа function) увеличивает читаемость.
Первый раз вижу CS. Отлично читается.
Отсутствие фигурных скобок, на мой взгляд, тут только увеличивает читаемость. Как и в ruby и в python-е. Возможно просто дело привычки. А вот слабость подсветки на лицо. Действительно бедная палитра. На моих скриншотах снизу больше «светофора».
Ну это уже от подсветки зависит. У меня в st3 "=>" выделяется добротно и глаза за него цепляются не хуже, чем за function. А вот раздражает он куда меньше.
В общем тут скорее на вкус и цвет. Отбивать руки явно не стоит.
скриншот
В общем тут скорее на вкус и цвет. Отбивать руки явно не стоит.
В данном случае внутри map находится, фактически, однострочник, который зачем-то написали в 5 строк. Можно вполне обойтись без промежуточной переменной name, воткнув вызов getName инлайн. А ещё лучше заиметь функцию getValueById.
А я говорил про действительно полноценные функции, составляющие некий логический блок.
А я говорил про действительно полноценные функции, составляющие некий логический блок.
Это и правда кошмарно читается — надо всматриваться где начало и конец блоков/вызовов, слишком много вложенных отступов/блоков.
Пример чуть побольше — и разработчики с ума сойдут.
Пример чуть побольше — и разработчики с ума сойдут.
const findUser = (id) => User.findOne({where: {id}})
const onSuccess = (user) => done(null, user)
passport
.deserializeUser(findUser)
.then(onSuccess)
.catch(done);
Вокруг единственного аргумента можно не ставить скобки:
const findUser = id => User.findOne({where: {id}})
const onSuccess = user => done(null, user)
По кодстайлу, на пример, Airbnb, так делать запрещено. На мой взгляд вот как раз эта возможность и ее использование может ухудшить читаемость
Неправда, у них сказано как раз наоборот:
If your function only takes a single argument, feel free to omit the parentheses.
Хм. Время идет, люди и гады меняются. Изначально было не так: github.com/airbnb/javascript/blob/58cdc731f435db78f3c1f4d466284796128fb75b/README.md#arrow-functions
Я все еще придерживаюсь старого гайда. Они еще перешли на trailing comma в описание объекта, что мне вообще не нравится.
Я все еще придерживаюсь старого гайда. Они еще перешли на trailing comma в описание объекта, что мне вообще не нравится.
Наверное, люди и гайды?)
От себя замечу, что считаю более разумным всегда ставить круглые скобки вокруг аргументов — во-первых, это увеличивает консистентность кода, во-вторых, количество аргументов может увеличиться.
От себя замечу, что считаю более разумным всегда ставить круглые скобки вокруг аргументов — во-первых, это увеличивает консистентность кода, во-вторых, количество аргументов может увеличиться.
Забавная очепятка.
Да, полностью согласен. Можно такого написать, что пару минут вчитываться прийдется.
Да, полностью согласен. Можно такого написать, что пару минут вчитываться прийдется.
const foo = a => b => c => a + b + c;
Да не, такого-то ни один разумный (во всяком случае, слышавший о правиле маньяка) программист писать не будет. А вот не ставить скобки соблазн может быть огромный. Но всё же считаю это плохой практикой.
Хотя я тоже не без греха. Например, у меня в коде иногда бывают такие штуки:
$C, если что — это от библиотечки, которая предоставляет одинаковый набор методов для любых коллекций.
Хотя я тоже не без греха. Например, у меня в коде иногда бывают такие штуки:
const values = $C(obj).reduce((result, value) => (result.push(value), result), []);
$C, если что — это от библиотечки, которая предоставляет одинаковый набор методов для любых коллекций.
Типичное каррирование, ИМХО оно всегда нечитабельное
И что тут не так?Вместо «(user)» можно просто «user» было бы записать.
(Не ошибка, но скобки лишние.)
У arrow-function не просто нет this, у них нет прототипа.
Возможно глупый вопрос, но почему лямбды называют стрелочными функциями?
Скажите, а что такое лямбда? Описание на той же вики, не очень проясняет вопрос. Лямбда обязана быть однострочной? Если да, то стрелочные функции — не обязаны. Лямбда это просто анонимный метод, определённый прямо посреди кода? Если так, то и обычные function-ы, без явно заданного имени, получается, тоже лямбды?
Ну, вопрос хороший, а я, к сожалению, не эксперт, но мне казалось, что в лямбде отсутствует контекст, т.е. (вроде как) используется контекст того «места», где лямбда создана. Опять таки боюсь ошибиться, но у function контекст есть.
Обычно лямбда или лямбда функция — это программистский слэнг, означающий «анонимная функция». Изначально это пошло из лямбда-исчисления, где вычисления представляются в виде лямбда-форм, которые по сути дела являются анонимными функциями. Во многих языках программирования ключевое слово lambda используется для определения анонимных функций, поэтому их стали называть лямбдами, иногда даже в языках где такого ключевого слова нет.
Стрелочные функции — это анонимные функции, так что да, их можно называть лямбдами. Но в JavaScript'е есть ещё обычные анонимные функции, которые тоже в общем-то лямбды, несмотря на их развесистый синтаксис. Возможно поэтому тут используется более специфичный термин «стрелочные функции».
Стрелочные функции — это анонимные функции, так что да, их можно называть лямбдами. Но в JavaScript'е есть ещё обычные анонимные функции, которые тоже в общем-то лямбды, несмотря на их развесистый синтаксис. Возможно поэтому тут используется более специфичный термин «стрелочные функции».
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Введение в стрелочные функции (arrow functions) в JavaScript ES6