Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since сентябрь 2016 г..
Выражения стрелочных функций имеют более короткий синтаксис по сравнению с функциональными выражениями и лексически привязаны к значению this (но не привязаны к собственному this, arguments, super, или new.target). Выражение стрелочных функций не позволяют задавать имя, поэтому стрелочные функции анонимны, если их ни к чему не присвоить.
Смотрите также "ES6 In Depth: Arrow functions" on hacks.mozilla.org.
Два фактора повлияли на появление стрелочных функции: более короткий синтаксис и лексика this.
В некоторых функциональных шаблонах приветствуются более короткие функции. Сравните:
До появления стрелочных функций, каждая новая функция имела своё значение this (новый объект в случае конструктора, undefined в strict режиме вызова функции, контекст объекта при вызове функции как "метода объекта" и т.д.). Это очень раздражало при использовании объектно-ориентированного стиля программирования.
В ECMAScript 3/5, данная проблема решалась присваиванием значения this переменной:
Кроме этого, может быть создана привязанная функция, в которую передаётся требуемое значение this для функции (функция growUp() в примере выше).
Стрелочные функции не содержат собственный контекст this, а используют значение this окружающего контекста. Поэтому нижеприведённый код работает как предполагалось:
Поскольку значение this определяется лексикой, правила строгого режима (strict mode) относительно this игнорируются:
Все остальные правила строгого режима применяются как обычно.
Так как значение this определяется лексикой, вызов стрелочных функций с помощью методов call() или apply(), даже если передать аргументы в эти методы, не влияет на значение this:
Стрелочные функции не имеют собственного объекта arguments, поэтому в теле стрелочных функций arguments будет ссылаться на переменную в окружающей области.
В большинстве случаев лучшей заменой объекта arguments в стрелочных функциях являются остаточные параметры:
Как показано ранее, стрелочные функции лучше всего подходят для функций без методов. Посмотрим, что будет, когда мы попробуем их использовать как методы:
Стрелочные функции не объявляют привязку ("bind") их контекста this. Другой пример включает Object.defineProperty():
Стрелочные функции не могут быть использованы как конструктор и вызовут ошибку при использовании с new:
Ключевое слово yield не может быть использовано в теле стрелочной функции (за исключением случаев, когда разрешается использовать в функциях, вложенных в тело стрелочной функции). Как следствие стрелочные функции не могут быть использованы как генераторы.
Тело стрелочной функции может иметь краткую (concise body) или блочную (block body) форму.
Блочная форма не возвращает значение, необходимо явно вернуть значение.
Помните о том, что возвращаемые объектные строки используют сокращённый синтаксис: params => {object:literal} будет работать не так, как ожидается.
Это происходит потому что код в скобках ({}) распознаётся как цепочка выражений (т.е. foo трактуется как наименование, а не как ключ в объектной строке).
Не забывайте оборачивать скобками объектные строки.
Стрелочная функция не может содержать разрывы строк между параметрами и стрелкой.
Поскольку стрелка в стрелочной функции не является оператором, то стрелочные функции имеют специальные правила разбора (парсинга), которые взаимодействуют с приоритетами операторов иначе, чем в обычных функциях.
| ECMAScript® 2027 Language Specification # sec-arrow-function-definitions |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 17 дек. 2024 г. by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.