Szukaj…


Wprowadzenie

Funkcje strzałek to zwięzły sposób pisania anonimowych funkcji o leksykalnym zasięgu w ECMAScript 2015 (ES6) .

Składnia

  • x => y // Domniemany zwrot

  • x => {return y} // Jawny zwrot

  • (x, y, z) => {...} // Wiele argumentów

  • async () => {...} // Funkcje strzałek asynchronicznych

  • (() => {...}) () // Natychmiastowe wywołanie wyrażenia funkcyjnego

  • const myFunc = x

    => x * 2 // Przerwanie linii przed strzałką spowoduje wygenerowanie błędu „Nieoczekiwany token”

  • const myFunc = x =>

    x * 2 // Podział wiersza po strzale jest poprawną składnią

Uwagi

Aby uzyskać więcej informacji o funkcjach w JavaScript, zapoznaj się z dokumentacją funkcji .

Funkcje strzałek są częścią specyfikacji ECMAScript 6, więc obsługa przeglądarki może być ograniczona. Poniższa tabela pokazuje najwcześniejsze wersje przeglądarki obsługujące funkcje strzałek.

Chrom Krawędź Firefox Internet Explorer Opera Opera Mini Safari
45 12 22 Obecnie niedostępne 32 Obecnie niedostępne 10

Wprowadzenie

W JavaScript funkcje mogą być anonimowo zdefiniowane przy użyciu składni „arrow” ( => ), która jest czasami nazywana wyrażeniem lambda ze względu na podobieństwa Common Lisp .

Najprostsza forma funkcji strzałki ma argumenty po lewej stronie => a wartość zwracaną po prawej stronie:

item => item + 1 // -> function(item){return item + 1}

Tę funkcję można natychmiast wywołać , podając argument do wyrażenia:

(item => item + 1)(41) // -> 42

Jeśli funkcja strzałki przyjmuje pojedynczy parametr, nawiasy wokół tego parametru są opcjonalne. Na przykład następujące wyrażenia przypisują ten sam typ funkcji do zmiennych stałych :

const foo = bar => bar + 1;
const bar = (baz) => baz + 1;

Jeśli jednak funkcja strzałki nie przyjmuje żadnych parametrów lub więcej niż jednego parametru, nowy zestaw nawiasów musi zawierać wszystkie argumenty:

(() => "foo")() // -> "foo"

((bow, arrow) => bow + arrow)('I took an arrow ', 'to the knee...')
// -> "I took an arrow to the knee..."

Jeśli treść funkcji nie składa się z jednego wyrażenia, musi być otoczona nawiasami i użyć jawnej instrukcji return w celu uzyskania wyniku:

(bar => {
  const baz = 41;
  return bar + baz;
})(1); // -> 42

Jeśli ciało funkcji strzałki składa się tylko z literału obiektu, ten literał obiektu musi być ujęty w nawiasy:

(bar => ({ baz: 1 }))(); // -> Object {baz: 1}

Dodatkowe nawiasy wskazują, że nawiasy otwierające i zamykające są częścią literału obiektu, tj. Nie są ogranicznikami treści funkcji.

Schemat leksykalny i oprawa (wartość „tego”)

Funkcje strzałek mają zasięg leksykalny ; Oznacza to, że ich this Oprawa jest związany kontekście otaczającej zakresie. To znaczy, cokolwiek this dotyczy, można zachować za pomocą funkcji strzałki.


Spójrz na następujący przykład. Klasa Cow ma metodę, która pozwala wydrukować dźwięk, który wydaje po 1 sekundzie.

class Cow {

  constructor() {
    this.sound = "moo";
  }

  makeSoundLater() {
    setTimeout(() => console.log(this.sound), 1000);
  }
}

const betsy = new Cow();

betsy.makeSoundLater();

W makeSoundLater() this kontekst odnosi się do bieżącej instancji obiektu Cow , więc w przypadku wywołania betsy.makeSoundLater() kontekst this odnosi się do betsy .

Używając funkcji strzałki, zachowuję this kontekst, aby móc odwołać się do this.sound gdy przyjdzie czas, aby go wydrukować, co poprawnie wydrukuje „moo”.


Jeśli użyłeś zwykłej funkcji zamiast funkcji strzałki, straciłbyś kontekst bycia w klasie i nie byłbyś w stanie uzyskać bezpośredniego dostępu do właściwości sound .

Obiekt argumentów

Funkcje strzałek nie ujawniają obiektu argumentów; dlatego arguments odnosiłyby się po prostu do zmiennej w bieżącym zakresie.

const arguments = [true];
const foo = x => console.log(arguments[0]);

foo(false); // -> true

Z tego powodu funkcje strzałek również nie są świadome swojego dzwoniącego / odbierającego.

Podczas gdy brak obiektu argumentów może być ograniczeniem w niektórych przypadkach krawędzi, parametry spoczynkowe są ogólnie odpowiednią alternatywą.

const arguments = [true];
const foo = (...arguments) => console.log(arguments[0]);

foo(false); // -> false

Implikowany zwrot

Funkcje strzałek mogą domyślnie zwracać wartości, po prostu pomijając nawiasy klamrowe, które tradycyjnie otaczają ciało funkcji, jeśli ich ciało zawiera tylko jedno wyrażenie.

const foo = x => x + 1;
foo(1); // -> 2

Podczas korzystania z niejawnych zwrotów literały obiektów muszą być owinięte w nawiasach, aby nawiasy klamrowe nie były mylone z otwieraniem ciała funkcji.

const foo = () => { bar: 1 } // foo() returns undefined
const foo = () => ({ bar: 1 }) // foo() returns {bar: 1}

Jawny zwrot

Funkcje strzałek mogą zachowywać się bardzo podobnie do klasycznych funkcji, ponieważ możesz jawnie zwrócić z nich wartość za pomocą słowa kluczowego return ; po prostu owiń ciało funkcji nawiasami klamrowymi i zwróć wartość:

const foo = x => {
  return x + 1;
}

foo(1); // -> 2

Arrow działa jako konstruktor

Funkcje strzałek TypeError gdy są używane z new słowem kluczowym.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow