I denne vejledning lærer du om JavaScript-pilfunktion ved hjælp af eksempler.
Pilefunktion er en af de funktioner, der introduceres i ES6-versionen af JavaScript. Det giver dig mulighed for at oprette funktioner på en renere måde sammenlignet med almindelige funktioner. For eksempel
Denne funktion
// function expression let x = function(x, y) ( return x * y; )
kan skrives som
// using arrow functions let x = (x, y) => x * y;
ved hjælp af en pilfunktion.
Pilefunktionssyntaks
Syntaksen for pilfunktionen er:
let myFunction = (arg1, arg2,… argN) => ( statement(s) )
Her,
myFunction
er funktionens navnarg1, arg2,… argN
er funktionsargumenternestatement(s)
er funktionskroppen
Hvis kroppen har et enkelt udsagn eller udtryk, kan du skrive pilens funktion som:
let myFunction = (arg1, arg2,… argN) => expression
Eksempel 1: Pilefunktion uden argument
Hvis en funktion ikke tager noget argument, skal du bruge tomme parenteser. For eksempel,
let greet = () => console.log('Hello'); greet(); // Hello
Eksempel 2: Pilefunktion med ét argument
Hvis en funktion kun har et argument, kan du udelade parenteserne. For eksempel,
let greet = x => console.log(x); greet('Hello'); // Hello
Eksempel 3: Pilefunktion som udtryk
Du kan også dynamisk oprette en funktion og bruge den som et udtryk. For eksempel,
let age = 5; let welcome = (age console.log('Baby') : () => console.log('Adult'); welcome(); // Baby
Eksempel 4: Multiline pilefunktioner
Hvis et funktionsorgan har flere udsagn, skal du placere dem i krøllede parenteser ()
. For eksempel,
let sum = (a, b) => ( let result = a + b; return result; ) let result1 = sum(5,7); console.log(result1); // 12
dette med pilefunktion
Inde i en almindelig funktion henviser dette nøgleord til den funktion, hvor det kaldes.
Er imidlertid this
ikke forbundet med pilfunktioner. Pilfunktionen har ikke sin egen this
. Så når du ringer this
, henviser det til dets overordnede omfang. For eksempel,
Inde i en almindelig 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 udefineret vindue ()
Her er this.age
indvendigt this.sayName()
tilgængeligt, fordi det this.sayName()
er metoden til et objekt.
Det er dog innerFunc()
en normal funktion og this.age
er ikke tilgængelig, fordi det this
refererer til det globale objekt (Window-objekt i browseren). Derfor this.age
inde i innerFunc()
funktionen giver undefined
.
Inde i 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
Her innerFunc()
defineres funktionen ved hjælp af pilfunktionen. Og inde i pilfunktionen this
refererer til forældrenes omfang. Derfor this.age
giver 25 .
Argumenter bindende
Almindelige funktioner har argumenter, der er bindende. Derfor, når du sender argumenter til en almindelig funktion, kan du få adgang til dem ved hjælp af arguments
nøgleordet. For eksempel,
let x = function () ( console.log(arguments); ) x(4,6,7); // Arguments (4, 6, 7)
Pilefunktioner har ikke bindende argumenter.
Når du prøver at få adgang til et argument ved hjælp af pilfunktionen, giver det en fejl. For eksempel,
let x = () => ( console.log(arguments); ) x(4,6,7); // ReferenceError: Can't find variable: arguments
For at løse dette problem kan du bruge den spredte syntaks. For eksempel,
let x = (… n) => ( console.log(n); ) x(4,6,7); // (4, 6, 7)
Pilefunktion med løfter og tilbagekald
Pile-funktioner giver bedre syntaks til at skrive løfter og tilbagekald. For eksempel,
// ES5 asyncFunction().then(function() ( return asyncFunction1(); )).then(function() ( return asyncFunction2(); )).then(function() ( finish; ));
kan skrives som
// ES6 asyncFunction() .then(() => asyncFunction1()) .then(() => asyncFunction2()) .then(() => finish);
Ting du bør undgå med pilefunktioner
1. Du bør ikke bruge pilefunktioner til at oprette metoder inde i objekter.
let person = ( name: 'Jack', age: 25, sayName: () => ( // this refers to the global… // console.log(this.age); ) ) person.sayName(); // undefined
2. Du kan ikke bruge en pilefunktion som konstruktør . For eksempel,
let Foo = () => (); let foo = new Foo(); // TypeError: Foo is not a constructor
Bemærk : Pilefunktioner blev introduceret i ES6 . Nogle browsere understøtter muligvis ikke brugen af pilfunktioner. Besøg JavaScript Arrow Function support for at lære mere.