В този урок ще научите за функцията за стрелка на JavaScript с помощта на примери.
Функцията стрелка е една от функциите, въведени в ES6 версията на JavaScript. Тя ви позволява да създавате функции по-изчистен начин в сравнение с обикновените функции. Например,
Тази функция
// function expression let x = function(x, y) ( return x * y; )
може да се запише като
// using arrow functions let x = (x, y) => x * y;
с помощта на стрелка.
Синтаксис на функцията със стрелки
Синтаксисът на функцията стрелка е:
let myFunction = (arg1, arg2,… argN) => ( statement(s) )
Тук,
myFunction
е името на функциятаarg1, arg2,… argN
са аргументите на функциятаstatement(s)
е функционалното тяло
Ако тялото има единичен израз или израз, можете да напишете функцията стрелка като:
let myFunction = (arg1, arg2,… argN) => expression
Пример 1: Функция със стрелка без аргумент
Ако функция не приема аргумент, трябва да използвате празни скоби. Например,
let greet = () => console.log('Hello'); greet(); // Hello
Пример 2: Функция със стрелка с един аргумент
Ако функция има само един аргумент, можете да пропуснете скобите. Например,
let greet = x => console.log(x); greet('Hello'); // Hello
Пример 3: Функция стрелка като израз
Можете също така динамично да създадете функция и да я използвате като израз. Например,
let age = 5; let welcome = (age console.log('Baby') : () => console.log('Adult'); welcome(); // Baby
Пример 4: Многоредови стрелкови функции
Ако тялото на функция има множество изрази, трябва да ги поставите във фигурни скоби ()
. Например,
let sum = (a, b) => ( let result = a + b; return result; ) let result1 = sum(5,7); console.log(result1); // 12
това с функция стрелка
Вътре в обикновена функция, тази ключова дума се отнася до функцията, където се нарича.
Не this
е свързано обаче с функциите на стрелките. Функцията стрелка няма своя собствена this
. Така че, когато се обадите this
, той се отнася до своя родителски обхват. Например,
Вътре в обикновена функция
function Person() ( this.name = 'Jack', this.age = 25, this.sayName = function () ( // this is accessible console.log(this.age); function innerFunc() ( // this refers to the global object console.log(this.age); console.log(this); ) innerFunc(); ) ) let x = new Person(); x.sayName();
Изход
25 недефиниран прозорец ()
Тук this.age
вътре this.sayName()
е достъпен, защото this.sayName()
е методът на обект.
Това обаче innerFunc()
е нормална функция и this.age
не е достъпна, защото се this
отнася до глобалния обект (обект Window в браузъра). Следователно, this.age
вътре innerFunc()
функцията дава undefined
.
Вътре в функция със стрелка
function Person() ( this.name = 'Jack', this.age = 25, this.sayName = function () ( console.log(this.age); let innerFunc = () => ( console.log(this.age); ) innerFunc(); ) ) const x = new Person(); x.sayName();
Изход
25 25
Тук innerFunc()
функцията се дефинира с помощта на стрелката. А във функцията стрелка се this
отнася до обхвата на родителя. Следователно, this.age
дава 25 .
Обвързване на аргументи
Редовните функции имат обвързване на аргументи. Ето защо, когато предавате аргументи на обикновена функция, можете да получите достъп до тях с помощта на arguments
ключовата дума. Например,
let x = function () ( console.log(arguments); ) x(4,6,7); // Arguments (4, 6, 7)
Функциите със стрелки нямат обвързващи аргументи.
Когато се опитате да получите достъп до аргумент с помощта на функцията стрелка, той ще даде грешка. Например,
let x = () => ( console.log(arguments); ) x(4,6,7); // ReferenceError: Can't find variable: arguments
За да разрешите този проблем, можете да използвате синтаксиса за разпространение. Например,
let x = (… n) => ( console.log(n); ) x(4,6,7); // (4, 6, 7)
Функция със стрелка с обещания и обратно извикване
Функциите със стрелки осигуряват по-добър синтаксис за писане на обещания и обратно извикване. Например,
// ES5 asyncFunction().then(function() ( return asyncFunction1(); )).then(function() ( return asyncFunction2(); )).then(function() ( finish; ));
може да се запише като
// ES6 asyncFunction() .then(() => asyncFunction1()) .then(() => asyncFunction2()) .then(() => finish);
Неща, които трябва да избягвате със стрелките
1. Не трябва да използвате функции със стрелки за създаване на методи вътре в обекти.
let person = ( name: 'Jack', age: 25, sayName: () => ( // this refers to the global… // console.log(this.age); ) ) person.sayName(); // undefined
2. Не можете да използвате функция стрелка като конструктор . Например,
let Foo = () => (); let foo = new Foo(); // TypeError: Foo is not a constructor
Забележка : Функциите със стрелки са въведени в ES6 . Някои браузъри може да не поддържат използването на функции със стрелки. Посетете поддръжката на функцията за стрелка на JavaScript, за да научите повече.