JavaScript Kapanışları

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, displayNameiş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 g1bir 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 xve işlevin işlev tanımını döndürür multiply(). multiply()Fonksiyon tek bir argüman alır yve döner x * y.

Hem multiply3ve multiply4muhafazalardır.

calculate()Fonksiyon bir parametre geçen adlandırılır x. Çağrıldığında multiply3ve 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 ave kullansanız bile, fonksiyonun aiçindeki değişkeni etkilemez sum().

Not : Genellikle veri gizliliği için kapamalar kullanılır.

Ilginç makaleler...