Що означає "=>" (стрілка, сформована з рівних та більших, ніж) у JavaScript?


444

Я знаю, що >=оператор означає більше або дорівнює, але я бачив =>у деякому вихідному коді. У чому сенс цього оператора?

Ось код:

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

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

    continueSave();
}).then(null, Components.utils.reportError);

5
Дивіться це посилання про функції стрілок .
Місталіс

Відповіді:


547

Що це

Це функція зі стрілкою. Функції стрілки - це короткий синтаксис, введений ECMAscript 6, який може використовуватися аналогічно тому, як ви б використовували вирази функцій. Іншими словами, ви можете часто використовувати їх замість виразів, як function (foo) {...}. Але вони мають деякі важливі відмінності. Наприклад, вони не пов'язують власні цінності this(див. Нижче для обговорення).

Функції стрілок є частиною специфікації ECMAscript 6. Вони ще не підтримуються у всіх браузерах, але вони частково або повністю підтримуються в Node v. 4.0+ та в більшості сучасних браузерів, які використовуються з 2018 року (я включив частковий список підтримуючих браузерів нижче).

Більше можна прочитати в документації на Mozilla про функції стрілок .

З документації на Mozilla:

Функція стрілка вираз (також відоме як жир функція стрілки) має більш короткий синтаксис по порівнянні з функціональними виразами і лексичний пов'язує thisзначення (не пов'язує свій власні this, arguments, superабо new.target). Функції стрілок завжди анонімні. Ці вирази функцій найкраще підходять для неметодних функцій, і їх не можна використовувати як конструктори.

Примітка про те, як thisпрацює функція стрілки

Одна з найбільш зручних функцій функції стрілки закопана у тексті вище:

Функція стрілки ... лексично пов'язує thisзначення (не пов'язує власне this...)

Що означає це простіше, це те, що функція стрілки зберігає thisзначення зі свого контексту і не має власного this. Традиційна функція може пов'язувати власне thisзначення залежно від того, як вона визначена та викликана. Для цього може знадобитися багато гімнастики, наприклад self = this;, тощо, щоб отримати доступ до thisоднієї функції всередині іншої функції або керувати нею . Для отримання додаткової інформації з цієї теми див . Пояснення та приклади в документації на Mozilla .

Приклад коду

Приклад (також із документів):

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]

Примітки щодо сумісності

Ви можете використовувати функції стрілок у «Вузолі», але підтримка браузера - плямиста.

Підтримка браузера для цієї функціональності значно покращилася, але вона все ще недостатньо поширена для більшості браузерних звичаїв. З 12 грудня 2017 року він підтримується в поточних версіях:

  • Chrome (версія 45+)
  • Firefox (v. 22+)
  • Край (v. 12+)
  • Opera (версія 32+)
  • Браузер Android (v. 47+)
  • Opera Mobile (версія 33+)
  • Chrome для Android (версія 47+)
  • Firefox для Android (v. 44+)
  • Сафарі (v. 10+)
  • iOS Safari (версія 10.2+)
  • Інтернет в Інтернеті Samsung (v. 5+)
  • Веб-переглядач Baidu (версія 7.12+)

Не підтримується в:

  • IE (через т. 11)
  • Opera Mini (через версію 8.0)
  • Blackberry Browser (через версію 10)
  • IE Mobile (через версію 11)
  • Веб-переглядач для Android (до версії 11.4)
  • QQ (через версію 1.2)

Ви можете знайти більше (та більш актуальну) інформацію на сайті CanIUse.com (без приналежності).


3
Схоже, що TypeScript також підтримує його.
mtyson

1
Схоже, це лямбда-вираз, так?
Аддем

1
Хотів зазначити, що стосується сумісності браузера, я використовую функції стрілок ES6 / ES7 та інші функції, несумісні з IE11, але я використовую Gulp або Webpack разом з Babel, щоб перевести ES6 в ES5, щоб він працював в IE11. Тож якщо вам потрібна підтримка IE11, і ви не проти налаштувати Babel, тоді займіться цим.
mbokil

76

Це відоме як функція стрілки, частина специфікації ECMAScript 2015 ...

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

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

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

Коротший синтаксис, ніж попередній:

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

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

DEMO

Інша дивовижна річ лексична this ... Зазвичай ви робите щось на кшталт:

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();

Але це можна переписати стрілкою так:

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
Детальніше про синтаксис

Докладніше, ось досить непогана відповідь, коли використовувати функції стрілок.


Було б добре оновити демонстраційні версії, щоб використовувати esfiddle.net, оскільки es6fiddle.net вже не працює
Wavesailor

25

Це було б "вираження функції стрілки", введене в ECMAScript 6.

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

Для історичних цілей (якщо сторінка вікі зміниться пізніше), це:

Вираз функції стрілки має коротший синтаксис порівняно з виразами функцій і лексично пов'язує це значення. Функції стрілок завжди анонімні.


1
пам'ятайте, включаючи достатню кількість інформації, щоб більшість читачів не потребували деталізації?
djechlin

2
Вікі, до якого я посилався, дуже коротко описує, що це таке: "Вираз функції стрілки має коротший синтаксис порівняно з виразами функцій і лексично пов'язує це значення. Функції стрілок завжди анонімні".
Кайл Фальконер

1
Додавши, що як цитата тут, дійсно допоможе ваша відповідь.
Hanky ​​Panky

22

Це функції стрілок

Також відомі як функції жирової стрілки . Вони є чистим та чітким способом запису функціональних виразів, наприклад function() {}.

Стрілка Функція може видалити необхідність function, returnі {}при визначенні функцій. Вони є однолінійними, схожими на Lambda Expressions на Java або Python.

Приклад без параметрів

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

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

Якщо потрібно зробити кілька заяв в межах однієї функції стрілки, вам потрібно загортати, у цьому прикладі, queue[0]фігурні дужки {}. У цьому випадку заявку повернення не можна опустити.

Приклад з 1 параметром

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

addCustomer('Toby');

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

Ви можете пропустити {}із сказаного.

Коли є один параметр, дужки ()навколо параметра можуть бути опущені.

Приклад з кількома параметрами

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

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

Корисний приклад

const fruits = [
    {name: 'Apple', price: 2},
    {name: 'Bananna', price: 3},
    {name: 'Pear', price: 1}
];

Якби ми хотіли отримати ціну кожного фрукта в одному масиві, в ES5 ми могли б зробити:

fruits.map(function(fruit) {
    return fruit.price;
}); // [2, 3, 1]

У ES6 за допомогою нових функцій стрілок ми можемо зробити це більш стислим:

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

Додаткову інформацію про функції стрілок можна знайти тут .

Сумісність браузера

  • IE: Не підтримується
  • Край: 12+ (усі версії)
  • Firefox: 22+
  • Chrome: 45+
  • Сафарі: 10+
  • iOS Safari: 10.2+
  • Android Browser: 56+

Додаткову актуальну інформацію про сумісність браузера можна знайти тут


21

просто додати ще один приклад того, що може зробити лямбда без використання карти:

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

13

Як говорили інші, це новий синтаксис для створення функцій.

Однак такі функції відрізняються від звичайних:

  • Вони пов'язують thisзначення. Як пояснила специфікація ,

    ArrowFunction не визначає локальні прив'язки для arguments, super, this, або new.target. Будь-яке посилання на arguments, super, thisабо в new.targetмежах ArrowFunction повинна вирішити прив'язки в лексичний укладає середовищі. Зазвичай це буде середовище функцій функцій, що негайно включають.

    Навіть незважаючи на те, що ArrowFunction може містити посилання на superоб'єкт функції, створений на кроці 4, не перетворюється на метод шляхом виконання MakeMethod . ArrowFunction , що посилання super завжди містяться в не- ArrowFunction і необхідний стан для реалізації superдоступний через обсяг , який захоплюється функція об'єкт ArrowFunction .

  • Вони неконструктори.

    Це означає, що вони не мають внутрішнього методу [[Construct]], і тому вони не можуть бути ініційованими, наприклад

    var f = a => a;
    f(123);  // 123
    new f(); // TypeError: f is not a constructor


6

Додавання простого прикладу CRUD за допомогою 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)); 

4

Незадоволений іншими відповідями. Відповідь, яка проголосувала вгорі, станом на 2019/3/13 фактично неправильна.

Короткий короткий варіант того, що =>означає, що це ярлик, який записує функцію І для прив'язки її до струмуthis

const foo = a => a * 2;

Фактично це ярлик для

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

Ви можете бачити всі речі, які скоротилися. Нам не потрібні function, ані returnні, .bind(this)ні дужки чи дужки

Трохи довший приклад функції стрілки може бути

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

Показавши, що якщо ми хочемо кілька аргументів функції, нам потрібні круглі дужки, і якщо ми хочемо написати більше, ніж один вираз, нам потрібні дужки і явне return.

Важливо зрозуміти .bindчастину, і це велика тема. Це стосується того, що thisозначає JavaScript.

ВСІ функції мають неявний параметр, який називається this. Як thisвстановлюється при виклику функції, залежить від того, як вона називається.

Брати

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

Якщо ви називаєте це нормально

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

this буде глобальним об’єктом.

Якщо ви перебуваєте в суворому режимі

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

// or

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

Це буде undefined

Ви можете встановити thisбезпосередньо, використовуючи callабо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}

Ви також можете встановити thisнеявно за допомогою оператора точок.

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

Проблема виникає, коли ви хочете використовувати функцію як зворотний дзвінок або слухач. Ви робите клас і хочете призначити функцію як зворотний виклик, який отримує доступ до екземпляра класу.

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

Код, наведений вище, не буде працювати, оскільки коли елемент запускає подію та викликає функцію, thisзначення не буде екземпляром класу.

Одним із поширених способів вирішити цю проблему є використання .bind

class ShowName {
  constructor(name, elem) {
    this.name = name;
    elem.addEventListener('click', function() {
       console.log(this.name); 
    }.bind(this); // <=========== ADDED! ===========
  }
}

Тому що синтаксис стрілки робить те саме, що ми можемо написати

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

bindефективно робить нову функцію . Якби bindне існувало, ви могли в основному зробити так, як це ви хочете

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

У старих JavaScript без оператора розповсюдження це було б

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

Розуміння цього коду вимагає розуміння закриттів, але коротка версія - bindце нова функція, яка завжди викликає оригінальну функцію зі thisзначенням, яке було пов'язане з нею. Функція стрілки робить те саме, оскільки вони є ярликомbind(this)


2

Як і всі інші відповіді вже сказано, це частина синтаксису функції стрілок ES2015. Більш конкретно, це не оператор, це punctuator маркер , який відокремлює параметри від тіла: ArrowFunction : ArrowParameters => ConciseBody. Напр (params) => { /* body */ }.


1

ES6 Функції стрілки:

У javascript =>- символ вираження функції стрілки. Вираз функції стрілки не має власного thisприв'язки і тому не може використовуватися як конструкторська функція. наприклад:

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

Правила використання функцій стрілок:

  • Якщо є рівно один аргумент, ви можете опустити круглі дужки аргументу.
  • Якщо ви повернете вираз і зробите це в одному рядку, ви можете опустити {}і returnоператор

Наприклад:

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

Функції стрілки, позначені символом (=>), допомагають створювати анонімні функції та методи. Це призводить до більш короткого синтаксису. Наприклад, нижче проста функція "Додати", яка повертає додавання двох чисел.

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

Вищевказана функція стає коротшою, використовуючи синтаксис «Стрілка», як показано нижче.

введіть тут опис зображення

Наведений вище код має дві частини, як показано на наведеній вище схемі: -

Введення: - Цей розділ визначає вхідні параметри анонімної функції.

Логіка: - Цей розділ надходить після символу "=>". У цьому розділі є логіка фактичної функції.

Багато розробників вважають, що функція стрілок робить ваш синтаксис коротшим, простішим і, таким чином, робить ваш код читабельним.

Якщо ви вірите вищенаведеному реченню, тоді дозвольте запевнити, що це міф. Якщо ви на мить подумаєте, правильно написана функція з ім'ям читається набагато легше, ніж криптичні функції, створені в одному рядку, використовуючи символ стрілки.

Основне використання функції стрілки полягає у забезпеченні запуску коду в контексті виклику.

Дивіться наведений нижче код, у якому визначена глобальна змінна "контекст", ця глобальна змінна має доступ до функції "SomeOtherMethod", яка викликається з іншого методу "SomeMethod".

Цей "SomeMethod" має локальну змінну "контексту". Через те, що "SomeOtherMethod" викликається з "" SomeMethod ", ми очікуємо, що він відобразить" локальний контекст ", але він відображає" глобальний контекст ".

var context = global context”;

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

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

var instance = new SomeMethod();

Але якщо замінити виклик за допомогою функції стрілки, він відобразить "локальний контекст".

var context = "global context";

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

Я б закликав вас прочитати це посилання ( функція стрілки в JavaScript ), де пояснюються всі сценарії контексту javascript і в яких сценаріях контекст виклику не дотримується.

Ви також можете побачити демонстрацію функції стрілки з javascript у цьому відео на YouTube, яке демонструє практично термін Context.


0

Як зазначають інші, звичайні (традиційні) функції використовують thisвід об'єкта, який викликав функцію, (наприклад, натиснуту кнопку) . Натомість функції стрілки використовують thisвід об’єкта, який визначає функцію.

Розглянемо дві майже однакові функції:

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


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

Нижній фрагмент демонструє принципову різницю між тим, що thisпредставляє для кожної функції. У звичайних функціональних виходах в [object HTMLButtonElement]той час як функції стрілки виходів [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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.