Bu eğitimde, örnekler yardımıyla JavaScript kapanışları hakkında bilgi edineceksiniz.
Kapanışları öğrenmeden önce, iki kavramı anlamanız gerekir:
- İç İçe İşlev
- Bir işlevi döndürmek
JavaScript İç İçe İşlevi
JavaScript'te, bir işlev başka bir işlevi de içerebilir. Buna iç içe geçmiş işlev adı verilir. Örneğin,
// 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
Yukarıdaki programda, greet()
işlev , içindeki işlevi içerir displayName()
.
Bir Fonksiyonu Geri Verme
JavaScript'te, bir işlev içindeki bir işlevi de döndürebilirsiniz. Örneğin,
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
Çıktı
function displayName () (console.log ('Hi' + '' + name);) Merhaba John
Yukarıdaki programda greet()
işlev, displayName
işlev tanımını döndürüyor .
Burada, döndürülen işlev tanımı g1 değişkenine atanır. G1'i kullanarak yazdırdığınızda console.log(g1)
, işlev tanımını alacaksınız.
G1 değişkeninde depolanan işlevi çağırmak için g1()
parantezlerle kullanıyoruz.
JavaScript Kapanışları
JavaScript'te, kapatma, dış işlev kapatıldıktan sonra bile iç işlevin içinden bir işlevin dış kapsamına erişim sağlar. Örneğin,
// 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
Çıktı
function displayName () (// ad değişkenine erişiliyor return 'Hi' + '' + name;) Merhaba John
Yukarıdaki örnekte, greet()
işlev çağrıldığında, işlev tanımını döndürür displayName
.
Burada, işleve g1
bir referanstır displayName()
.
Çağrıldığında g1()
, yine de greet()
işleve erişimi vardır .
Çalıştırdığımızda console.log(g1)
fonksiyon tanımını döndürür.
Python, Swift, Ruby vb. Diğer programlama dilleri için kapatma kavramı mevcuttur.
Başka bir örneğe bakalım.
// 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
Yukarıdaki programda, calculate()
işlev tek bir bağımsız değişken alır x
ve işlevin işlev tanımını döndürür multiply()
. multiply()
Fonksiyon tek bir argüman alır y
ve döner x * y
.
Hem multiply3
ve multiply4
muhafazalardır.
calculate()
Fonksiyon bir parametre geçen adlandırılır x
. Çağrıldığında multiply3
ve multiply4
çağrıldığında, multipy()
işlevin dış calculate()
işlevin geçirilen x bağımsız değişkenine erişimi vardır .
Veri gizliliği
JavaScript kapatma, programın veri gizliliğine yardımcı olur. Örneğin,
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
Yukarıdaki örnekte, sum()
işlev, işlevin işlev tanımını döndürür increaseSum()
.
A değişkeni, increaseSum()
işlevin içinde artırılır . Bununla birlikte, bir değişkenin değeri, işlevin dışında da değiştirilebilir. Bu durumda, a = a + 1;
değişkenin değerini işlevin dışında değiştirir.
Şimdi, a değişkeninin yalnızca işlev içinde artırılmasını istiyorsanız, bir kapatma kullanabilirsiniz. Örneğin,
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
Yukarıdaki örnekte, sum()
işlev a değerini 0 olarak ayarlar ve işlevi döndürür increaseSum()
.
Kapatma nedeniyle sum()
, halihazırda yürütülmüş olmasına rağmen , increaseSum()
yine de a erişimine sahiptir ve her çağrıldığında a'ya 1 eklenebilir x()
.
Ve a değişkeni sum()
işleve özeldir. Bu, a değişkenine yalnızca sum()
işlevin içinden erişilebileceği anlamına gelir .
Açıklasanız a
ve kullansanız bile, fonksiyonun a
içindeki değişkeni etkilemez sum()
.
Not : Genellikle veri gizliliği için kapamalar kullanılır.