JavaScript-variabler kan tilhøre den lokale eller globalt omfang.
Globale variabler kan gøres lokale (private) med lukninger.
En funktion
kan få adgang til alle variabler defineret inde i funktionen, sådan her:
function myFunction() {
let a = 4;
return a * a;
}
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>A function can access variables defined inside the function:</p>
<p id="demo"></p>
<script>
myFunction();
function myFunction() {
let a = 4;
document.getElementById("demo").innerHTML = a * a;
}
</script>
</body>
</html>
Men en funktion
kan også få adgang til variabler defineret uden for funktionen, som denne:
let a = 4;
function myFunction() {
return a * a;
}
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>A function can access variables defined outside the function:</p>
<p id="demo"></p>
<script>
let a = 4;
myFunction();
function myFunction() {
document.getElementById("demo").innerHTML = a * a;
}
</script>
</body>
</html>
I det sidste eksempel er a en global variabel.
På en webside hører globale variabler til siden.
Globale variabler kan bruges (og ændres) af alle andre scripts på siden.
I det første eksempel er a en lokal variabel.
En lokal variabel kan kun bruges i den funktion, hvor den er defineret. Det er skjult for andre funktioner og anden scripting-kode.
Global og lokale variabler med samme navn er forskellige variabler. Ændring af den ene ændrer ikke den anden.
Variabler oprettet uden et deklarationsnøgleord (var
, let
eller const
) er altid globale, selvom de er oprettet inde i en funktion.
function myFunction() {
a = 4;
}
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Functions</h2>
<p>Variables created without a declaration keyword (var, let, or const) are always global,
even if they are created inside a function.:</p>
<p id="demo"></p>
<script>
myFunction();
document.getElementById("demo").innerHTML = a * a;
function myFunction() {
a = 4;
}
</script>
</body>
</html>
Globale variabler lever, indtil siden kasseres, som når du navigerer til en anden side eller luk vinduet.
Lokal variabler har kort levetid. De oprettes, når funktionen er aktiveret og slettet, når funktionen er færdig.
Antag, at du vil bruge en variabel til at tælle noget, og du vil have dette tæller skal være tilgængelig for alle funktioner.
Du kan bruge en global variabel og en funktion
til at øge tælleren:
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
counter += 1;
}
// Call add() 3 times
add();
add();
add();
// The counter should now be 3
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Function Closures</h2>
<p>Counting with a global variable.</p>
<p id="demo"></p>
<script>
// Initiate counter
let counter = 0;
// Function to increment counter
function add() {
counter += 1;
}
// Call add() 3 times
add();
add();
add();
// The counter should now be 3
document.getElementById("demo").innerHTML = "The counter is: " + counter;
</script>
</body>
</html>
Der er et problem med løsningen ovenfor: Enhver kode på siden kan ændre tælleren uden kalder add().
Tælleren skal være lokal for funktionen add()
for at forhindre anden kode i at ændre sig det:
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 0
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Function Closures</h2>
<p>Counting with a local variable.</p>
<p id="demo"></p>
<script>
// Initiate counter
let counter = 0;
// Function to increment counter
function add() {
let counter = 0;
counter += 1;
}
// Call add() 3 times
add();
add();
add();
// The result is not 3 because you mix up the globaland local counter
document.getElementById("demo").innerHTML = "The counter is: " + counter;
</script>
</body>
</html>
Det virkede ikke, fordi vi viser den globale tæller i stedet for den lokale tæller.
Vi kan fjerne den globale tæller og få adgang til den lokale tæller ved at lade funktion returnerer det:
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
return counter;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 1.
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Closures</h2>
<p>Counting with a local variable.</p>
<button type="button" onclick="myFunction()">Count!</button>
<p id="demo">0</p>
<script>
// Function to increment counter
function add() {
let counter = 0;
counter += 1;
return counter;
}
// Trying to increment the counter
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
</script>
</body>
</html>
Det virkede ikke, fordi vi nulstillede den lokale tæller, hver gang vi ringer til fungere.
En indre JavaScript-funktion kan løse dette.
Alle funktioner har adgang til det globale omfang.
Faktisk har alle funktioner i JavaScript adgang til omfanget "over" dem.
JavaScript understøtter indlejrede funktioner. Indlejrede funktioner har adgang til rækkevidde "over" dem.
I dette eksempel har den indre funktion plus()
adgang til tæller
-variablen i den overordnede funktion:
function add() {
let counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
Prøv det selv →
Dette kunne have løst moddilemmaet, hvis vi kunne nå plus()
fungere udefra.
Vi skal også finde en måde at udføre counter=0
kun én gang.
Vi har brug for en lukning.
Husk selvpåkaldende funktioner? Hvad gør denne funktion?
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();
// the counter is now 3
Prøv det selv →
Variablen add
er tildelt returværdien af en selvpåkaldende fungere.
Den selvpåkaldende funktion kører kun én gang. Den sætter tælleren til nul (0), og returnerer et funktionsudtryk.
På denne måde bliver add en funktion. Den "vidunderlige" del er, at den kan få adgang tælleren i overordnet omfang.
Dette kaldes en JavaScript lukning. Det gør det muligt for at en funktion skal have "private" variabler.
Tælleren er beskyttet af omfanget af den anonyme funktion, og kan kun ændres ved hjælp af tilføjelsesfunktionen.
En lukning er en funktion, der har adgang til det overordnede omfang, selv efter at den overordnede funktion er lukket.