03.i Arrow functions (=>)
Arrow-функции - это новая разновидность функций в JS:
Более компактный синтаксис
Не имеют собственного контекста вызова
Весь контекст определяется по правилам лексической области видимости на основе родительских контекстов.
arguments
super
this
new.target
Их нельзя использовать в качестве конструктора
Syntax
Новый синтаксис для задания функций через «стрелку» =>
.
Arrow-функции, чье тело представляет собой одно выражение могут не содержать фигурных скобок:
Если единственным выражением в теле функции является литерал объекта, то он должен оборачиваться в обычные скобки, что бы подчеркнуть, что это выражение - () => ({...})
. Как только тело функции оборачивается в {…}
, то для неё начинают действовать те же правила, что и для обычных функций:
Execution Context
Функции-стрелки не имеют ни своего this
, ни своего arguments
: внутри функций-стрелок — тот же this
, что и снаружи. Это очень удобно в обработчиках событий и callback.
Отсутствие у функции-стрелки «своего this
влечёт за собой естественное ограничение: такие функции нельзя использовать в качестве конструктора, то есть нельзя вызывать через new
.
Есть тонкое различие между функцией стрелкой =>
и обычной функцией, у который вызван .bind(this)
:
Вызовом
.bind(this)
мы передаём текущийthis
, привязывая его к функции.При
=>
привязки не происходит, так как функция стрелка вообще не имеет контекстаthis
. Поискthis
в ней осуществляется по лексическим областям видимости также, как и поиск обычной переменной, то есть, выше в замыкании.
В качестве arguments
используются аргументы внешней “обычной” функции. Сохранение внешнего this
и arguments
удобно использовать для последующей передачи вызовов и создания декораторов. Например, декоратор defer(f, ms)
ниже получает функцию f
и возвращает обёртку вокруг неё, откладывающую вызов на ms
миллисекунд:
Last updated
Was this helpful?