Ebben az oktatóanyagban példák segítségével megismerheti a JavaScript bezárásait.
Mielőtt elsajátítaná a bezárásokat, meg kell értenie két fogalmat:
- Beágyazott funkció
- Funkció visszaadása
JavaScript beágyazott funkciója
A JavaScript-ben egy függvény tartalmazhat más funkciót is. Ezt hívjuk beágyazott függvénynek. Például,
// 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
A fenti programban a greet()
függvény tartalmazza a displayName()
benne lévő funkciót.
Funkció visszaadása
A JavaScript-ben funkciót is visszaadhat egy függvényen belül. Például,
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
Kimenet
function displayName () (console.log ('Szia' + '' + név);) Szia John
A fenti programban a greet()
függvény visszaadja a displayName
függvény definícióját.
Itt a visszaküldött függvénydefiníció a g1 változóhoz van rendelve. Ha a g1 használatával nyomtat console.log(g1)
, megkapja a függvénydefiníciót.
A g1 változóban tárolt függvény meghívásához g1()
zárójelekkel használjuk .
JavaScript bezárások
A JavaScriptben a bezárás hozzáférést biztosít a függvény külső hatóköréhez a belső függvény belsejéből, még akkor is, ha a külső funkció bezárult. Például,
// 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
Kimenet
function displayName () (// a névváltozó elérése visszaadja 'Hi' + '' + name;) Szia John
A fenti példában, ha greet()
függvényt hívunk meg, akkor a függvény definícióját adja vissza displayName
.
Itt g1
egy hivatkozás a displayName()
függvényre.
Amikor g1()
hívják, akkor is hozzáfér a greet()
funkcióhoz.
Amikor futunk console.log(g1)
, visszaadja a függvény definícióját.
A bezárás fogalma létezik más programozási nyelveknél is, mint a Python, a Swift, a Ruby stb.
Nézzünk meg egy másik példát.
// 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
A fenti programban a calculate()
függvény egyetlen argumentumot vesz fel, x
és visszaadja a függvény multiply()
függvénydefinícióját. A multiply()
függvény egyetlen argumentumot vesz fel, y
és visszatér x * y
.
Mindkettő multiply3
és multiply4
bezárás.
A calculate()
függvényt paraméter átadásának nevezzük x
. Amikor multiply3
és mikor multiply4
hívják meg, a multipy()
függvény hozzáfér a külső calculate()
függvény átadott x argumentumához .
Adatvédelem
A JavaScript bezárása elősegíti a program adatvédelmét. Például,
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
A fenti példában a sum()
függvény visszaadja a függvény increaseSum()
függvénydefinícióját.
A változó a increaseSum()
függvényen belül megnövekszik . A változó értéke azonban a függvényen kívül is megváltoztatható. Ebben az esetben a = a + 1;
megváltoztatja a változó értékét a függvényen kívül.
Most, ha azt szeretné, hogy a változó csak a függvényen belül növekedjen, használhat egy lezárást. Például,
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
A fenti példában a sum()
függvény az a értékét 0-ra állítja, és visszaadja a increaseSum()
függvényt.
A bezárás miatt, annak ellenére sum()
, hogy már végrehajtva van, increaseSum()
mégis hozzáfér a -hoz, és minden egyes híváskor hozzáadhat 1- et x()
.
A változó pedig privát a sum()
függvényhez. Ez azt jelenti, hogy a változó csak a sum()
függvény belsejében érhető el .
Még akkor is, ha deklarálja a
és használja, ez nem befolyásolja a a
függvényen belüli változót sum()
.
Megjegyzés : Általában a bezárásokat használják az adatvédelem érdekében.