I denna handledning lär du dig om JavaScript-pilfunktionen med hjälp av exempel.
Pilfunktionen är en av funktionerna som introduceras i ES6-versionen av JavaScript. Det låter dig skapa funktioner på ett renare sätt jämfört med vanliga funktioner. Till exempel
Denna funktion
// function expression let x = function(x, y) ( return x * y; )
kan skrivas som
// using arrow functions let x = (x, y) => x * y;
med en pilfunktion.
Pilsfunktionssyntax
Syntaxen för pilfunktionen är:
let myFunction = (arg1, arg2,… argN) => ( statement(s) )
Här,
myFunction
är namnet på funktionenarg1, arg2,… argN
är funktionsargumentenstatement(s)
är funktionskroppen
Om kroppen har ett enda uttalande eller uttryck kan du skriva pilfunktionen som:
let myFunction = (arg1, arg2,… argN) => expression
Exempel 1: Pilfunktion utan argument
Om en funktion inte tar något argument bör du använda tomma parenteser. Till exempel,
let greet = () => console.log('Hello'); greet(); // Hello
Exempel 2: Pilfunktion med ett argument
Om en funktion bara har ett argument kan du utelämna parenteserna. Till exempel,
let greet = x => console.log(x); greet('Hello'); // Hello
Exempel 3: Pilfunktion som ett uttryck
Du kan också skapa en funktion dynamiskt och använda den som ett uttryck. Till exempel,
let age = 5; let welcome = (age console.log('Baby') : () => console.log('Adult'); welcome(); // Baby
Exempel 4: Funktioner med flera linjer
Om en funktionsdel har flera påståenden måste du placera dem inom lockiga parenteser ()
. Till exempel,
let sum = (a, b) => ( let result = a + b; return result; ) let result1 = sum(5,7); console.log(result1); // 12
detta med pilfunktionen
Inuti en vanlig funktion hänvisar detta nyckelord till den funktion där den kallas.
Förknippas dock this
inte med pilfunktioner. Pilfunktionen har inte sin egen this
. Så när du ringer this
hänvisar det till dess överordnade omfång. Till exempel,
Inuti en vanlig funktion
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();
Produktion
25 odefinierat fönster ()
Här är this.age
insidan this.sayName()
tillgängligt eftersom det this.sayName()
är metoden för ett objekt.
Det innerFunc()
är dock en normal funktion och this.age
är inte tillgänglig eftersom det this
hänvisar till det globala objektet (Window-objekt i webbläsaren). Därför ger funktionen this.age
inuti .innerFunc()
undefined
Inuti en pilfunktion
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();
Produktion
25 25
Här innerFunc()
definieras funktionen med hjälp av pilfunktionen. Och inuti pilfunktionen this
hänvisar till föräldrarnas omfattning. Därför this.age
ger 25 .
Argument bindande
Vanliga funktioner har bindande argument. Det är därför när du skickar argument till en vanlig funktion kan du komma åt dem med arguments
nyckelordet. Till exempel,
let x = function () ( console.log(arguments); ) x(4,6,7); // Arguments (4, 6, 7)
Pilfunktionerna har inga bindande argument.
När du försöker komma åt ett argument med hjälp av pilfunktionen kommer det att ge ett fel. Till exempel,
let x = () => ( console.log(arguments); ) x(4,6,7); // ReferenceError: Can't find variable: arguments
För att lösa problemet kan du använda spridningssyntaxen. Till exempel,
let x = (… n) => ( console.log(n); ) x(4,6,7); // (4, 6, 7)
Pilfunktion med löften och återuppringningar
Pilfunktioner ger bättre syntax för att skriva löften och återuppringningar. Till exempel,
// ES5 asyncFunction().then(function() ( return asyncFunction1(); )).then(function() ( return asyncFunction2(); )).then(function() ( finish; ));
kan skrivas som
// ES6 asyncFunction() .then(() => asyncFunction1()) .then(() => asyncFunction2()) .then(() => finish);
Saker du bör undvika med pilfunktioner
1. Du bör inte använda pilfunktioner för att skapa metoder inuti objekt.
let person = ( name: 'Jack', age: 25, sayName: () => ( // this refers to the global… // console.log(this.age); ) ) person.sayName(); // undefined
2. Du kan inte använda en pilfunktion som konstruktör . Till exempel,
let Foo = () => (); let foo = new Foo(); // TypeError: Foo is not a constructor
Obs! Pilfunktioner introducerades i ES6 . Vissa webbläsare stöder kanske inte pilfunktionerna. Besök JavaScript Arrow Function support för att lära dig mer.