Поиск…
Вступление
Функции стрелок - это сжатый способ написания анонимных , лексически ограниченных функций в ECMAScript 2015 (ES6) .
Синтаксис
x => y // Неявный возврат
x => {return y} // Явный возврат
(x, y, z) => {...} // Несколько аргументов
async () => {...} // Функции функции Async arrow
(() => {...}) () // Выражение функции с немедленным вызовом
const myFunc = x
=> x * 2 // Разрыв строки перед тем, как стрелка вызовет ошибку «Неожиданный токен»
const myFunc = x =>
x * 2 // Разрыв строки после того, как стрелка является допустимым синтаксисом
замечания
Дополнительную информацию о функциях в JavaScript см. В документации по функциям .
Функции Arrow являются частью спецификации ECMAScript 6, поэтому поддержка браузера может быть ограничена. В следующей таблице показаны самые ранние версии браузера, поддерживающие функции стрелок.
Хром | край | Fire Fox | Internet Explorer | опера | опера мини | Сафари |
---|---|---|---|---|---|---|
45 | 12 | 22 | в настоящее время недоступен | 32 | в настоящее время недоступен | 10 |
Вступление
В JavaScript функции могут быть анонимно определены с использованием синтаксиса «arrow» ( =>
), который иногда называют лямбда-выражением из-за общих сходств Лиспа .
Простейшая форма функции стрелки имеет свои аргументы в левой части =>
и возвращаемое значение в правой части:
item => item + 1 // -> function(item){return item + 1}
Эта функция может быть немедленно вызвана путем предоставления аргумента выражения:
(item => item + 1)(41) // -> 42
Если функция стрелки принимает один параметр, скобки вокруг этого параметра являются необязательными. Например, следующие выражения назначают один и тот же тип функции в постоянные переменные :
const foo = bar => bar + 1;
const bar = (baz) => baz + 1;
Однако, если функция стрелки не принимает никаких параметров или более одного параметра, новый набор круглых скобок должен содержать все аргументы:
(() => "foo")() // -> "foo"
((bow, arrow) => bow + arrow)('I took an arrow ', 'to the knee...')
// -> "I took an arrow to the knee..."
Если тело функции не состоит из одного выражения, оно должно быть окружено скобками и использовать явный оператор return
для предоставления результата:
(bar => {
const baz = 41;
return bar + baz;
})(1); // -> 42
Если тело функции стрелки состоит только из объектного литерала, этот литерал объекта должен быть заключен в круглые скобки:
(bar => ({ baz: 1 }))(); // -> Object {baz: 1}
Дополнительные скобки указывают, что открывающие и закрывающие скобки являются частью литерала объекта, т. Е. Они не являются разделителями тела функции.
Лексическое определение и привязка (значение «this»)
Функции стрелки лексически ограничены ; это означает , что их this
Binding связана с контекстом окружающей области. То есть, что бы this
ни говорило, можно сохранить с помощью функции стрелки.
Взгляните на следующий пример. Класс Cow
имеет метод, позволяющий распечатывать звук, который он делает через 1 секунду.
class Cow {
constructor() {
this.sound = "moo";
}
makeSoundLater() {
setTimeout(() => console.log(this.sound), 1000);
}
}
const betsy = new Cow();
betsy.makeSoundLater();
В makeSoundLater()
this
контекст относится к текущему экземпляру объекта Cow
, поэтому в случае, когда я вызываю betsy.makeSoundLater()
, this
контекст относится к betsy
.
Используя функцию стрелки, я сохраняю this
контекст, чтобы я мог ссылаться на this.sound
когда пришло время распечатать его, что будет правильно распечатывать «moo».
Если вы использовали регулярную функцию вместо функции стрелки, вы потеряете контекст пребывания внутри класса и не сможете напрямую обращаться к sound
свойству.
Объект Аргументов
Функции Arrow не выставляют объект аргументов; поэтому arguments
просто ссылаются на переменную в текущей области.
const arguments = [true];
const foo = x => console.log(arguments[0]);
foo(false); // -> true
Благодаря этому функции стрелок также не знают своего вызывающего абонента / вызываемого абонента.
Хотя отсутствие объектов аргументов может быть ограничением в некоторых случаях кросс, параметры отдыха обычно являются подходящей альтернативой.
const arguments = [true];
const foo = (...arguments) => console.log(arguments[0]);
foo(false); // -> false
Неявное возвращение
Функции Arrow могут косвенно возвращать значения, просто опуская фигурные скобки, которые традиционно обертывают тело функции, если их тело содержит только одно выражение.
const foo = x => x + 1;
foo(1); // -> 2
При использовании неявных возвратов литералы объектов должны быть завернуты в круглые скобки, чтобы фигурные скобки не ошибались при открытии тела функции.
const foo = () => { bar: 1 } // foo() returns undefined
const foo = () => ({ bar: 1 }) // foo() returns {bar: 1}
Явное возвращение
Функции Arrow могут вести себя очень похоже на классические функции, поскольку вы можете явно вернуть значение из них с помощью ключевого слова return
; просто оберните тело вашей функции фигурными фигурными скобками и верните значение:
const foo = x => {
return x + 1;
}
foo(1); // -> 2
Стрелка функционирует как конструктор
Функции Arrow будут TypeError
при использовании с new
ключевым словом.
const foo = function () { return 'foo'; } const a = new foo(); const bar = () => { return 'bar'; } const b = new bar(); // -> Uncaught TypeError: bar is not a constructor...