Co oznacza "= > " (strzałka utworzona z równych i większych niż) w JavaScript?

Wiem, że operator >= oznacza więcej lub równo, ale widziałem => w jakimś kodzie źródłowym. Co oznacza ten operator?

Oto kod:

promiseTargetFile(fpParams, aSkipPrompt, relatedURI).then(aDialogAccepted => {
    if (!aDialogAccepted)
        return;

    saveAsType = fpParams.saveAsType;
    file = fpParams.file;

    continueSave();
}).then(null, Components.utils.reportError);
Author: MultiplyByZer0, 2014-07-23

13 answers

Co To Jest

Jest to funkcja strzałki. funkcje strzałek to krótka składnia wprowadzona przez ECMAscript 6, która może być używana podobnie jak wyrażenia funkcyjne. Innymi słowy, często można ich używać zamiast wyrażeń takich jak function (foo) {...}. Ale mają pewne istotne różnice. Na przykład, nie wiążą własnych wartości this (patrz poniżej w dyskusji).

Funkcje strzałek są częścią specyfikacji ECMAscript 6. Jeszcze nie są w przeciwieństwie do innych przeglądarek, nie są one w pełni obsługiwane przez Node V.4. 0+i większość nowoczesnych przeglądarek w użyciu od 2018 roku. (Poniżej zamieściłem częściową listę obsługiwanych przeglądarek).

Więcej można przeczytać w dokumentacji Mozilli {[20] } na funkcjach strzałek .

Z Dokumentacji Mozilli:

Wyrażenie funkcji strzałki (znane również jako funkcja strzałki fat) ma krótszą składnię w porównaniu do funkcji wyrażenia i leksykalnie wiąże this wartość (nie wiąże własnych this, arguments, super, lub new.target). Funkcje strzałek są zawsze anonimowe. Te wyrażenia funkcyjne najlepiej nadają się do funkcji innych niż metody i nie mogą być używane jako konstruktory.

Uwaga na temat działania this w funkcjach strzałek

Jedną z najbardziej przydatnych cech funkcji strzałki jest pogrzebany w powyższym tekście:

An funkcja strzałek... leksykalnie wiąże wartość this (nie wiąże własnej this...)

W uproszczeniu oznacza to, że funkcja arrow zachowuje wartość {[2] } ze swojego kontekstu i nie ma własnej this. Tradycyjna funkcja może wiązać swoją własną wartość this, w zależności od tego, jak jest zdefiniowana i wywołana. Może to wymagać wielu ćwiczeń gimnastycznych, takich jak self = this;, itp., aby uzyskać dostęp lub manipulować this z jednej funkcji wewnątrz innej funkcji. Więcej informacji na ten temat temat, zobacz wyjaśnienie i przykłady w dokumentacji Mozilli .

Przykładowy Kod

Przykład (również z dokumentów):

var a = [
  "We're up all night 'til the sun",
  "We're up all night to get some",
  "We're up all night for good fun",
  "We're up all night to get lucky"
];

// These two assignments are equivalent:

// Old-school:
var a2 = a.map(function(s){ return s.length });

// ECMAscript 6 using arrow functions
var a3 = a.map( s => s.length );

// both a2 and a3 will be equal to [31, 30, 31, 31]

Uwagi dotyczące zgodności

Możesz używać funkcji strzałek w Node, ale wsparcie przeglądarki jest spotty.

Obsługa przeglądarki dla tej funkcji znacznie się poprawiła, ale nadal nie jest wystarczająco rozpowszechniona dla większości przeglądarek. Od 12 grudnia 2017 r. JEST OBSŁUGIWANA W aktualnych wersjach of:

  • Chrome (V. 45+)
  • Firefox (v. 22+)
  • Edge (v. 12+)
  • Opera (V. 32+)
  • przeglądarka Android (v. 47+)
  • Opera Mobile (V. 33+)
  • [[76]} Chrome dla Androida (V. 47+) Firefox dla Androida (V. 44+)]}
  • Safari (V. 10+)
  • [[76]} iOS Safari (V. 10.2+)
  • Samsung Internet (V. 5+)
  • Baidu Browser (V. 7. 12+)

Nie obsługiwane w:

  • IE (przez v. 11)
  • Opera Mini (do V. 8. 0)
  • Przeglądarka Blackberry (do V. 10)
  • IE Mobile (do V. 11)
  • [[76]} UC Browser dla Androida (do wersji 11.4)
  • QQ (przez V. 1. 2)

Więcej (i więcej aktualnych) informacji można znaleźć na stronie CanIUse.com (brak przynależności).

 576
Author: elixenide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

To znana jako funkcja Strzałki, część ECMAScript 2015 spec ...

var foo = ['a', 'ab', 'abc'];

var bar = foo.map(f => f.length);

console.log(bar); // 1,2,3

Krótsza składnia niż poprzednia:

// < ES6:
var foo = ['a', 'ab', 'abc'];

var bar = foo.map(function(f) {
  return f.length;
});
console.log(bar); // 1,2,3

DEMO

Drugą niesamowitą rzeczą jest leksykalna this... Zazwyczaj robisz coś w stylu:

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  var self = this;
  setInterval(function() {
    // this is the Window, not Foo {}, as you might expect
    console.log(this); // [object Window]
    // that's why we reassign this to self before setInterval()
    console.log(self.count);
    self.count++;
  }, 1000)
}

new Foo();

Ale można to przepisać strzałką jak to:

function Foo() {
  this.name = name;
  this.count = 0;
  this.startCounting();
}

Foo.prototype.startCounting = function() {
  setInterval(() => {
    console.log(this); // [object Object]
    console.log(this.count); // 1, 2, 3
    this.count++;
  }, 1000)
}

new Foo();

DEMO

MDN
więcej o składni

Aby dowiedzieć się więcej, oto całkiem dobra odpowiedź nakiedy używać funkcji strzałek.

 78
Author: brbcoding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-22 14:44:43

Są to funkcje strzałek

Znane również jako Fat Arrow Functions. Są one czystym i wygodnym sposobem zapisu wyrażeń funkcji, np. function() {}.

Funkcje strzałek mogą usunąć potrzebę function, return i {} przy definiowaniu funkcji. Są one Jednowierszowe, podobne do wyrażeń Lambda w Javie lub Pythonie.

Przykład bez parametrów

const queue = ['Dave', 'Sarah', 'Sharon'];
const nextCustomer = () => queue[0];

console.log(nextCustomer()); // 'Dave'

Jeśli w ramach tej samej funkcji strzałki trzeba wykonać wiele poleceń, należy aby zawinąć, w tym przykładzie, queue[0] w nawiasy curley {}. W tym przypadku nie można pominąć instrukcji return.

Przykład z 1 parametrem

const queue = ['Dave', 'Sarah', 'Sharon'];
const addCustomer = name => {
  queue.push(name);
};

addCustomer('Toby');

console.log(queue); // ['Dave', 'Sarah', 'Sharon', 'Toby']

Możesz pominąć {} z powyższego.

Gdy istnieje jeden parametr, nawiasy () wokół parametru mogą być pominięte.

Przykład z wieloma parametrami

const addNumbers = (x, y) => x + y

console.log(addNumbers(1, 5)); // 6

Użyteczny przykład

const fruits = [
    { name: 'Apple', price: 2 },
    { name: 'Bananna', price: 3 },
    { name: 'Pear', price: 1 }
];
Jeśli chcemy uzyskać cenę każdego owocu w pojedyncza tablica, w ES5 możemy zrobić:
fruits.map(function(fruit) {
    return fruit.price;
}); // [2, 3, 1]

W ES6 z nowymi funkcjami strzałek możemy uczynić to bardziej zwięzłym:

fruits.map(fruit => fruit.price); // [2, 3, 1]

Dodatkowe informacje na temat funkcji strzałek można znaleźć tutaj .

 26
Author: Toby Mellor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-02 23:09:20

Byłoby to "wyrażenie funkcji strzałek" wprowadzone w ECMAScript 6.

Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/arrow_functions

Dla celów historycznych (jeśli strona wiki zmieni się później), jest to:

Wyrażenie funkcji strzałki ma krótszą składnię w porównaniu do wyrażeń funkcji i leksykalnie wiąże tę wartość. Funkcje strzałek są zawsze anonimowe.

 25
Author: Kyle Falconer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 02:32:22

Aby dodać kolejny przykład tego, co lambda może zrobić bez użycia mapy:

a = 10
b = 2

var mixed = (a,b) => a * b; 
// OR
var mixed = (a,b) => { (any logic); return a * b };

console.log(mixed(a,b)) 
// 20
 21
Author: Bart Calixto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 12:57:15

Jak mówili inni, jest to nowa składnia do tworzenia funkcji.

Jednak tego rodzaju funkcje różnią się od normalnych:

  • Wiążą wartość this. Jak wyjaśnia spec,

    An ArrowFunction nie definiuje lokalnych wiązań dla arguments, super, this, lub new.target. Wszelkie odniesienia do arguments, super, this, lub new.target w obrębie ArrowFunction musi rozwiązywać do wiązania w leksykalnie zamykającym środowisko. Typowo będzie to środowisko funkcyjne natychmiastowego zamykania funkcja.

    Chociaż funkcja ArrowFunction może zawierać odniesienia do super, obiekt funkcji utworzony w kroku 4 nie jest przekształcony w metodę przez wykonanie MakeMethod . An ArrowFunction that references super jest zawsze zawarta w nie - ArrowFunction i niezbędne stan do wdrożenia super jest dostępny za pośrednictwem zakresu to jest uchwycony przez obiekt funkcji ArrowFunction .

  • Nie są konstruktorami.

    Oznacza to, że nie mają wewnętrznej metody [[Construct]], a zatem nie mogą być utworzone, np.

    var f = a => a;
    f(123);  // 123
    new f(); // TypeError: f is not a constructor
    
 14
Author: Oriol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-11 22:48:25

Czytałem, że jest to symbol Arrow Functions w ES6

To

var a2 = a.map(function(s){ return s.length });

Używając Arrow Function można zapisać jako

var a3 = a.map( s => s.length );

MDN Docs

 8
Author: Mritunjay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 02:33:05

Niezadowolony z innych odpowiedzi. Top głosował odpowiedź od 2019/3/13 jest faktycznie błędne.

Skrócona wersja tego, co => oznacza, że jest to skrót piszący funkcję i do wiązania jej z bieżącym this

const foo = a => a * 2;

Jest skrótem do

const foo = function(a) { return a * 2; }.bind(this);

Możesz zobaczyć wszystkie rzeczy, które zostały skrócone. Nie potrzebowaliśmy function, ani return ani .bind(this) ani nawet szelek ani nawiasów

Nieco dłuższy przykład funkcji strzałki może być

const foo = (width, height) => {
  const area = width * height;
  return area;
};

Pokazując, że jeśli chcemy mieć wiele argumentów do funkcji, potrzebujemy nawiasów, a jeśli chcemy napisać więcej niż jedno wyrażenie, potrzebujemy klamer i jawnego return.

Ważne jest, aby zrozumieć część .bind i to jest duży temat. Ma to związek z tym, co this oznacza w JavaScript.

Wszystkie funkcje mają niejawny parametr o nazwie this. To, jak this jest ustawione podczas wywoływania funkcji, zależy od tego, jak ta funkcja jest dzwoniłem.

Weź

function foo() { console.log(this); }

Jeśli nazwiesz to normalnie

function foo() { console.log(this); }
foo();

this będzie obiektem globalnym.

Jeśli jesteś w trybie ścisłym

`use strict`;
function foo() { console.log(this); }
foo();

// or

function foo() {
   `use strict`;
   console.log(this);
 }
foo();

Będzie undefined

Możesz ustawić this bezpośrednio za pomocą call lub apply

function foo(msg) { console.log(msg, this); }

const obj1 = {abc: 123}
const obj2 = {def: 456}

foo.call(obj1, 'hello');  // prints Hello {abc: 123}
foo.apply(obj2, ['hi']);  // prints Hi {def: 456}

Można również ustawić this domyślnie używając operatora kropki .

function foo(msg) { console.log(msg, this); }
const obj = {
   abc: 123,
   bar: foo,
}
obj.bar('Hola');  // prints Hola {abc:123, bar: f}

Problem pojawia się, gdy chcesz użyć funkcji jako wywołania zwrotnego lub słuchacza. Tworzysz klasę i chcesz przypisać funkcję jako callback to dostęp do instancji klasy.

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name);  // won't work
    }); 
  }
}

Powyższy kod nie zadziała, ponieważ gdy element wywoła zdarzenie i wywoła funkcję, wartość this nie będzie instancją klasy.

Jednym z powszechnych sposobów rozwiązania tego problemu jest użycie .bind
class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name); 
    }.bind(this); // <=========== ADDED! ===========
  }
}

Ponieważ składnia arrow robi to samo możemy napisać

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click',() => {
       console.log(this.name); 
    });
  }
}

bind efektywnie tworzy nową funkcję . Jeśli bind nie istnieje można w zasadzie zrobić własne jak to

function bind(functionToBind, valueToUseForThis) {
  return function(...args) {
    functionToBind.call(valueToUseForThis, ...args);
  };
}

W starszych JavaScript bez operatora spread byłoby

function bind(functionToBind, valueToUseForThis) {
  return function() {
    functionToBind.apply(valueToUseForThis, arguments);
  };
}

Zrozumienie, że kod wymaga zrozumienia zamknięć , ale skrócona wersja to bind tworzy nową funkcję, która zawsze wywołuje oryginalną funkcję z this wartością, która była z nią związana. Funkcje strzałek robią to samo, ponieważ są skrótem do bind(this)

 8
Author: gman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-11 09:04:39

Dodawanie prostego przykładu CRUD z funkcją Arrowfunction

 //Arrow Function
 var customers   = [
   {
     name: 'Dave',
     contact:'9192631770'
   },
   {
     name: 'Sarah',
     contact:'9192631770'
   },
   {
     name: 'Akhil',
     contact:'9928462656' 
   }],

// No Param READ
 getFirstCustomer = () => { 
   console.log(this);
   return customers[0];
 };
  console.log("First Customer "+JSON.stringify(getFirstCustomer())); // 'Dave' 

   //1 Param SEARCH
  getNthCustomer = index=>{
    if( index>customers.length)
    {
     return  "No such thing";
   }
   else{
       return customers[index];
     } 
  };
  console.log("Nth Customer is " +JSON.stringify(getNthCustomer(1))); 

   //2params ADD
  addCustomer = (name, contact)=> customers.push({
     'name': name,
     'contact':contact
    });
  addCustomer('Hitesh','8888813275');
  console.log("Added Customer "+JSON.stringify(customers)); 

  //2 param UPDATE
  updateCustomerName = (index, newName)=>{customers[index].name= newName};
  updateCustomerName(customers.length-1,"HiteshSahu");
  console.log("Updated Customer "+JSON.stringify(customers));

  //1 param DELETE
  removeCustomer = (customerToRemove) => customers.pop(customerToRemove);
  removeCustomer(getFirstCustomer());
  console.log("Removed Customer "+JSON.stringify(customers)); 
 6
Author: Hitesh Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-02 09:40:51

Jak wszystkie inne odpowiedzi już powiedziały, jest to część składni funkcji arrow ES2015. Dokładniej, nie jest to operator, jest to znak interpunkcyjny, który oddziela parametry od ciała: ArrowFunction : ArrowParameters => ConciseBody. Np. (params) => { /* body */ }.

 2
Author: JMM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-30 12:48:19

Funkcje strzałek oznaczone symbolem (=>) pomagają tworzyć anonimowe funkcje i metody. To prowadzi do krótszej składni. Na przykład poniżej znajduje się prosta funkcja "Add", która zwraca dodanie dwóch liczb.

function Add(num1 , num2 ){
return num1 + num2;
}

Powyższa funkcja staje się krótsza, używając składni "Arrow", jak pokazano poniżej.

Tutaj wpisz opis obrazka

Powyższy kod składa się z dwóch części, jak pokazano na powyższym schemacie:-

Input: - Ta sekcja określa parametry wejściowe do anonimowego funkcja.

Logic: - Ta sekcja pojawia się po symbolu "=>". Ta sekcja ma logikę rzeczywistej funkcji.

wielu programistów uważa, że funkcja arrow sprawia, że składnia jest krótsza, prostsza, a tym samym sprawia, że kod jest czytelny.

Jeśli wierzysz w powyższe zdanie, to zapewniam cię, że to mit. Jeśli przez chwilę uważasz, że poprawnie napisana funkcja z nazwą jest dużo czytelna niż funkcje kryptograficzne utworzone w jednej linii za pomocą strzałki symbol.

Głównym zastosowaniem funkcji strzałek jest upewnienie się, że kod działa w rozmówcy.

Patrz poniższy kod, w którym zdefiniowano globalną zmienną "context", ta globalna zmienna jest dostępna wewnątrz funkcji" SomeOtherMethod", która jest wywoływana z innej metody"SomeMethod".

Ten "SomeMethod" ma lokalną zmienną "context". Teraz, ponieważ "SomeOtherMethod" jest wywoływany z ""SomeMethod", oczekujemy, że wyświetli "lokalny kontekst" , ale wyświetla "kontekst globalny".

var context = “global context”;

function SomeOtherMethod(){
alert(this.context);
}

function SomeMethod(){
this.context = “local context”;
SomeOtherMethod();
}

var instance = new SomeMethod();

Ale jeśli zastąp wywołanie za pomocą funkcji Strzałki, wyświetli się "kontekst lokalny".

var context = "global context";

    function SomeMethod(){
        this.context = "local context";
        SomeOtherMethod = () => {
            alert(this.context);
        }
        SomeOtherMethod();
    }
    var instance = new SomeMethod();

Zachęcam do przeczytania tego linku (funkcja Arrow w JavaScript ), który wyjaśnia wszystkie scenariusze kontekstu javascript i w których scenariuszach kontekst wywołujących nie jest przestrzegany.

Możesz również zobaczyć demonstrację funkcji strzałek z javascript w tym filmie na youtube , który demonstruje praktycznie termin Kontekst.

 2
Author: Shivprasad Koirala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-10 01:11:07

Jak stwierdzili inni, zwykłe (tradycyjne) funkcje używają this z obiektu, który wywołał funkcję, (np. przycisk, który został kliknięty) . Zamiast tego, funkcje strzałek używają this z obiektu, który definiuje funkcję.

Rozważmy dwie prawie identyczne funkcje:

regular = function() {
  ' Identical Part Here;
}


arrow = () => {
  ' Identical Part Here;
}

Poniższy fragment pokazuje podstawową różnicę pomiędzy tym, co this reprezentuje dla każdej funkcji. Na funkcja regularna wyjścia [object HTMLButtonElement] funkcja strzałki wyjścia [object Window].

<html>
 <button id="btn1">Regular: `this` comes from "this button"</button>
 <br><br>
 <button id="btn2">Arrow: `this` comes from object that defines the function</button>
 <p id="res"/>

 <script>
  regular = function() {
    document.getElementById("res").innerHTML = this;
  }

  arrow = () => {
    document.getElementById("res").innerHTML = this;
  }

  document.getElementById("btn1").addEventListener("click", regular);
  document.getElementById("btn2").addEventListener("click", arrow);
 </script>
</html>
 2
Author: SlowLearner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-17 01:59:11

ES6 Funkcje strzałek:

W javascript => jest symbolem wyrażenia funkcji strzałki. Wyrażenie funkcji strzałki nie ma własnego powiązania this i dlatego nie może być użyte jako funkcja konstruktora. na przykład:

var words = 'hi from outside object';

let obj = {
  words: 'hi from inside object',
  talk1: () => {console.log(this.words)},
  talk2: function () {console.log(this.words)}
}

obj.talk1();  // doesn't have its own this binding, this === window
obj.talk2();  // does have its own this binding, this is obj

Zasady korzystania z funkcji strzałek:

  • Jeśli istnieje dokładnie jeden argument, możesz pominąć nawiasy argumentu.
  • jeśli zwrócisz wyrażenie i zrobisz to w tej samej linii można pominąć {} i return twierdzenie

Na przykład:

let times2 = val => val * 2;  
// It is on the same line and returns an expression therefore the {} are ommited and the expression returns implictly
// there also is only one argument, therefore the parentheses around the argument are omitted

console.log(times2(3));
 1
Author: Willem van der Veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 08:24:21