Uzávěry JavaScriptu
Proměnné JavaScriptu mohou patřit do místního nebo globálního rozsahu.
Globální proměnné mohou být místní (soukromé) s uzávěrkami .
Globální proměnné
A function
má přístup ke všem proměnným definovaným uvnitř funkce, takto:
Příklad
function myFunction() {
let a = 4;
return a * a;
}
Ale function
může také přistupovat k proměnným definovaným mimo funkci, jako je tato:
Příklad
let a = 4;
function myFunction() {
return a * a;
}
V posledním příkladu je a globální proměnná.
Na webové stránce patří globální proměnné k objektu okna.
Globální proměnné mohou používat (a měnit) všechny skripty na stránce (a v okně).
V prvním příkladu je a lokální proměnná.
Lokální proměnnou lze použít pouze uvnitř funkce, kde je definována. Je skrytý před ostatními funkcemi a jiným skriptovacím kódem.
Globální a lokální proměnné se stejným názvem jsou různé proměnné. Úprava jednoho nemění druhého.
Proměnné vytvořené bez klíčového slova deklarace ( var
,
let
, nebo const
) jsou vždy globální, i když jsou vytvořeny uvnitř funkce.
Příklad
function myFunction() {
a = 4;
}
Variabilní životnost
Globální proměnné fungují, dokud není stránka zahozena, například když přejdete na jinou stránku nebo zavřete okno.
Místní proměnné mají krátkou životnost. Jsou vytvořeny, když je funkce vyvolána, a odstraněny, když je funkce dokončena.
Protidilema
Předpokládejme, že chcete použít proměnnou pro počítání něčeho a chcete, aby byl tento čítač dostupný pro všechny funkce.
function
Pro zvýšení počítadla můžete použít globální proměnnou a a :
Příklad
// 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
S výše uvedeným řešením je problém: Libovolný kód na stránce může změnit počítadlo bez volání add().
Čítač by měl být pro add()
funkci lokální, aby se zabránilo tomu, že jej změní jiný kód:
Příklad
// 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
Nefungovalo to, protože místo místního počítadla zobrazujeme globální počítadlo.
Globální počítadlo můžeme odebrat a získat přístup k místnímu počítadlu tím, že necháme funkci, aby jej vrátila:
Příklad
// 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.
Nefungovalo to, protože jsme při každém volání funkce resetovali místní počítadlo.
Vnitřní funkce JavaScriptu to může vyřešit.
Vnořené funkce JavaScriptu
Všechny funkce mají přístup ke globálnímu rozsahu.
Ve skutečnosti v JavaScriptu mají všechny funkce přístup k rozsahu „nad“ sebou.
JavaScript podporuje vnořené funkce. Vnořené funkce mají přístup k rozsahu „nad“ nimi.
V tomto příkladu má vnitřní funkce plus()
přístup k counter
proměnné v rodičovské funkci:
Příklad
function add() {
let counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
To by mohlo vyřešit dilema čítače, pokud bychom se k plus()
funkci dostali zvenčí.
Musíme také najít způsob, jak provést counter = 0
pouze jednou.
Potřebujeme uzavření.
Uzávěry JavaScriptu
Pamatujete na samovolné funkce? Co tato funkce dělá?
Příklad
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();
// the counter is now 3
Příklad vysvětlen
Proměnná add
je přiřazena k návratové hodnotě samovolné funkce.
Samovolná funkce se spustí pouze jednou. Nastaví čítač na nulu (0) a vrátí výraz funkce.
Tímto způsobem se add stane funkcí. "Úžasná" část je, že má přístup k čítači v nadřazeném oboru.
Tomu se říká uzavření JavaScriptu. Umožňuje funkci mít " soukromé " proměnné.
Počítadlo je chráněno rozsahem anonymní funkce a lze jej změnit pouze pomocí funkce add.
Uzavření je funkce, která má přístup k nadřazenému oboru, i když se nadřazená funkce zavře.