Когда использовать функцию стрелки в JavaScript?
() => { console.log('test'); }
function() { console.log('test'); }
Когда использовать функцию стрелки в JavaScript?
() => { console.log('test'); }
function() { console.log('test'); }
Этот новый синтаксис для функций, представленный в ES6 , функционально эквивалентен обычным функциям в большинстве ситуаций, однако важно отметить следующие отличия:
Значение
this
, нормальные функции захватывают значениеthis
как глобальный объект (илиundefined
в строгом режиме ):В то время как стрелочные функции захватывают это значение из непосредственной внешней области видимости :
Аргументы, обычные функции имеют доступ к специальной переменной с именем
arguments
, которая похожа на массив и содержит ссылки на аргументы, которые передаются функции:В стрелочных функциях
arguments
это относится к переменной во внешней области видимостиundefined
, если эта переменная не существует, ее значение :Несмотря на это, аналогичный функционал можно реализовать и с остальными параметрами :
Если стрелочная функция просто возвращает одну строку кода, вы можете опустить скобки в операторе и ключевом слове return. Это говорит функции стрелки вернуть оператор.
Ключевое слово
yield
, это зарезервированное слово также было введено в ES6 и используется в функциях-генераторах , однако его нельзя использовать в стрелочных функциях.Стрелочные функции обеспечивают более элегантный и компактный синтаксис при использовании в качестве обратных вызовов , поэтому их можно использовать почти в тех же ситуациях, что и обычные функции, и, вероятно, они будут предпочтительнее в будущих версиях EcmaScript, просто помните об отличиях выше, чтобы не ошибиться. делать ошибки.
Стрелочные функции — это не просто синтаксический сахар, делающий обычное объявление функции более простым/элегантным. Между ними существуют значительные различия, из-за которых программа может работать не так, как ожидалось, и во многих случаях они не взаимозаменяемы.
Так что, я думаю, весь вопрос в том, когда их использовать, а когда нет?
Когда использовать стрелочные функции?
Сокращенный синтаксис чистых функций.
В следующем блоке они взаимозаменяемы, поскольку являются чистыми функциями (что их результат не зависит от внешней переменной). Что касается производительности, то они практически одинаковы .
Если вы хотите, чтобы функция стрелки выполнялась в той же лексической области видимости , что и содержащая функция:
Стрелочные функции оцениваются как часть лексической области видимости, которая их содержит, поэтому они не
this
являютсяarguments
надлежащими экземплярами стрелочной функции, а скорее экземплярами содержащей их функции. Эти типы функций не являются взаимозаменяемыми, вам придется переписать часть тела функции, если вы хотите переключиться с одного синтаксиса на другой.Рассмотрим этот другой блок:
Как вы можете видеть здесь, код более компактен, но поведение
this
сильно отличается.Когда НЕ использовать стрелочные функции?
Когда вам нужны динамические аргументы:
Как уже говорилось, стрелочные функции не раскрывают объект
arguments
, поэтому, если вам нужен доступ к нему, вы не можете их использовать. Обратите внимание, что если вы объявите функцию стрелки внутри другой функции, вы получите доступ к однойarguments
из содержащих функций (если она есть). Вот почему говорят, что стрелочные функции используют лексические аргументы. То есть они видят тот объектarguments
, который находится в лексическом объеме.Глобально:
В функциях генератора:
Ключевое слово
yield
не разрешено в стрелочных функциях. Эти функции не могут быть функциями генератора (однако они могут содержать функции генератора).