I denne vejledning lærer du om JavaScript-lukninger ved hjælp af eksempler.
Før du lærer om lukninger, skal du forstå to begreber:
- Indlejret funktion
- Returnering af en funktion
JavaScript nestet funktion
I JavaScript kan en funktion også indeholde en anden funktion. Dette kaldes en indlejret funktion. For eksempel,
// nested function example // outer function function greet(name) ( // inner function function displayName() ( console.log('Hi' + ' ' + name); ) // calling inner function displayName(); ) // calling outer function greet('John'); // Hi John
I ovenstående program greet()
indeholder displayName()
funktionen funktionen inde i den.
Returnering af en funktion
I JavaScript kan du også returnere en funktion inden for en funktion. For eksempel,
function greet(name) ( function displayName() ( console.log('Hi' + ' ' + name); ) // returning a function return displayName; ) const g1 = greet('John'); console.log(g1); // returns the function definition g1(); // calling the function
Produktion
funktion displaynavn () (console.log ('Hej' + '' + navn);) Hej John
I ovenstående program greet()
returnerer displayName
funktionen funktionsdefinitionen.
Her tildeles den returnerede funktionsdefinition til g1-variablen. Når du udskriver g1 ved hjælp af console.log(g1)
, får du funktionsdefinitionen.
For at kalde den funktion, der er gemt i g1-variablen, bruger vi g1()
med parenteser.
JavaScript-lukninger
I JavaScript giver lukning adgang til det ydre omfang af en funktion inde fra den indre funktion, selv efter at den ydre funktion er lukket. For eksempel,
// javascript closure example // outer function function greet() ( // variable defined outside the inner function let name = 'John'; // inner function function displayName() ( // accessing name variable return 'Hi' + ' ' + name; ) return displayName; ) const g1 = greet(); console.log(g1); // returns the function definition console.log(g1()); // returns the value
Produktion
funktion displaynavn () (// adgang til navnevariabel returnerer 'Hej' + '' + navn;) Hej John
I ovenstående eksempel, når greet()
funktion kaldes, returnerer den funktionsdefinitionen af displayName
.
Her g1
er en henvisning til displayName()
funktionen.
Når g1()
der kaldes, har den stadig adgang til greet()
funktionen.
Når vi kører console.log(g1)
, returnerer den funktionsdefinitionen.
Begrebet lukning findes for andre programmeringssprog som Python, Swift, Ruby osv.
Lad os se på et andet eksempel.
// closure example function calculate(x) ( function multiply(y) ( return x * y; ) return multiply; ) const multiply3 = calculate(3); const multiply4 = calculate(4); console.log(multiply3); // returns calculate function definition console.log(multiply3()); // NaN console.log(multiply3(6)); // 18 console.log(multiply4(2)); // 8
I ovenstående program calculate()
tager funktionen et enkelt argument x
og returnerer funktionsdefinitionen af multiply()
funktionen. Den multiply()
funktion tager et enkelt argument y
og returnerer x * y
.
Begge multiply3
og multiply4
er lukninger.
Den calculate()
funktion kaldes passerer en parameter x
. Når multiply3
og multiply4
kaldes, har multipy()
funktionen adgang til det passerede x-argument for den ydre calculate()
funktion.
Databeskyttelse
JavaScript-lukning hjælper med databeskyttelse af programmet. For eksempel,
let a = 0; function sum() ( function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) const x = sum(); console.log(x()); // 1 console.log(x()); // 2 console.log(x()); // 3 a = a + 1; console.log(a); // 4
I ovenstående eksempel sum()
returnerer funktionen funktionsdefinitionen af increaseSum()
funktionen.
Variablen a øges inde i increaseSum()
funktionen. Værdien af en variabel kan dog også ændres uden for funktionen. I dette tilfælde a = a + 1;
ændres værdien af variablen uden for funktionen.
Nu, hvis du kun vil øge en variabel inde i funktionen, kan du bruge en lukning. For eksempel,
function sum() ( let a = 0; function increaseSum() ( // the value of a is increased by 1 return a = a + 1; ) return increaseSum; ) let x = sum(); let a = 5; console.log(x()); // 1 console.log(x()); // 2 console.log(a); // 5
I ovenstående eksempel indstiller sum()
funktionen værdien a til 0 og returnerer increaseSum()
funktionen.
På grund af lukningen, selvom den sum()
allerede er udført, har den increaseSum()
stadig adgang til a og kan tilføje 1 til en hver gang x()
der kaldes.
Og en variabel er privat for sum()
funktionen. Det betyder, at variablen kun kan tilgås inde i sum()
funktionen.
Selvom du erklærer a
og bruger det, påvirker det ikke a
variablen inde i sum()
funktionen.
Bemærk : Generelt bruges lukninger til databeskyttelse.