Поиск…


Вступление

Функции стрелок - это сжатый способ написания анонимных , лексически ограниченных функций в 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...


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow