CLOSURE NEDİR?

CLOSURE :

JS de değişkenler static scope’a sahiptir.

Bir değişken local veya global scope’a dahil olabilir.

Bir fonksiyon düşünelim ki ilk oluşturulduğu andaki state’ini sonra herhangi bir zamanda çağrıldığı zaman hatırlasın.

Closurelar tam olarak bu işi yapmak için kullanılan bir js özelliğidir.

Öncelikle bir problem çıkaralım. Sonrasında onu çözmeye çalışalım.

<html>
        <body>
            
            <script type="text/javascript">
            var a=1;
        
        var lorem= function()
        {
            var a=2;
            return a+1;
        }
        var ipsum=lorem();
        document.write(ipsum)
        /*Çıktımız 3 olacak çünkü js de lexical scope'un gereği değişken o andaki scope 
        içerisinde aranır. Yoksa bir üst scope'a gidilir. Burada bir problem var aslında,
        local olarak tanımladığımız değişken sabit gibi oldu.
        Ne zaman fonksiyonu çağırsak 3 dönüyor.*/
            </script>
            </body>
            </html>
<html>
        <body>
            
            <script type="text/javascript">
            
            var a= 1;
            var lorem =function()
            {
                return a+1;
            }
            var ipsum =lorem();
            document.write(ipsum);
            /*Çıktı:2, lorem içerisindeki scope'da bulunmayan a değişkeni için engine,
            bir üst yani global scope'a geçerek değişkeni aramış ve bu değişkene
            ulaşmıştır.*/
            </script>
            </body>
            </html>
        
<html>
        <body>
            
            <script type="text/javascript">
            

        var a =1;
        var lorem= function ()
        {
            return a+1;
        }
        var a=93;
        var ipsum=lorem();
        document.write(ipsum);
        /* Çıktı: 94
        Bir önceki örneğimiz bozuldu. Çünkü kullandığımız değişken global
        olarak tanımlandığı için heryerden ulaşılabiliyor. 1.örnekteki gibi local
        tanımladığımızda da her seferinde başa dönerek vasıfsız hale geliyor.

        Bize ne lazım :) 
        - Hem geçmişe dayalı (ilk üretildiği ana dair) değerlere sahip olsun
        - Hem de fonksiyonel olabilsin (Kendini tekrar etmesin) 
        Bu noktada closure kullanıyoruz.
        */
            </script>
    </body>
</html>
<html>
        <body>
            
            <script type="text/javascript">
            
        var a=1;
        var lorem= function()
        {
            var a=2;
            return function()
            {
                return a+=1;
            }
        }
        var a=95;
        var ipsum=lorem();
        //ipsum=closure yapısı
        ipsum();
        ipsum();
        ipsum();
        document.write(ipsum);
      /*Bu örnekte lorem fonksiyonu için kendini çağıran fonksiyon şeklinde de
      tanımlanabilir*/

            </script>
    </body>
</html>