JavaScript: VanillaJs-DOM-#4-clouser

    JavaScript: VanillaJs-DOM-#4-clouser

    2022, Apr 13    

    λ³€μˆ˜μ˜ κ°€μ‹œμ˜μ—­κ³Ό μ „μ—­λ³€μˆ˜

        //var μ„ μ–Έ λ³€μˆ˜λŠ” 정적인 λ°©μ‹μœΌλ‘œ μƒμ„±λœλ‹€.
        //μ½”λ“œ μˆœμ„œμ— 따라 μƒνƒœλ₯Ό μ‚΄νŽ΄λ³΄μž.
        var a = 5;      //ν‚€μ›Œλ“œ : A
        console.log(a); //ν‚€μ›Œλ“œ : B
        /*
            μˆœμ„œ
                1. A -> B : 5 좜λ ₯
                2. B -> A : undefined(=λ³€μˆ˜λŠ” μ„ μ–Έν–ˆμœΌλ‚˜ 값을 ν• λ‹Ήν•˜μ§€ μ•Šμ€ μƒνƒœ. 즉, μžλ£Œν˜•μ΄ μ—†λŠ” μƒνƒœ *null은 λΉˆκ°’μ΄ ν• λ‹Ήλœ μƒνƒœ(빈객체))
                    그럼 μ™œ undefined 인가? μ°Έμ‘°λ³€μˆ˜λŠ” λ§Œλ“€μ–΄μ‘ŒμœΌλ‚˜ 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ€ μƒνƒœ. λ‹€μ‹œλ§ν•΄ μˆœμ„œμ— μ˜ν•΄ 값은 ν• λ‹Ήλœλ‹€.
         */
    
        //μ „μ—­λ³€μˆ˜(global)λŠ” 동적인 λ°©μ‹μœΌλ‘œ μƒμ„±λœλ‹€.
        //varλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” ν‚€μ›Œλ“œμ΄λ©° μƒλž΅ν•΄λ„ 좜λ ₯이 되며, μ΄λ•Œ μ „μ—­κ°μ²΄λ‘œ windowλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ„ μ–Έλœλ‹€.
        //ex)window.b 이런 경우 μˆœμ„œλ₯Ό λ°”κΎΈλ©΄ μ—λŸ¬κ°€ λ‚˜μ˜¨λ‹€. (Uncaught ReferenceError: b is not defined)
        b = "bμ˜κ°’μž…λ‹ˆλ‹€";   //ν‚€μ›Œλ“œ : A
        console.log(b);    //ν‚€μ›Œλ“œ : B
    
        //μ „μ—­λ³€μˆ˜ window.d = 1; μ§€μ—­λ³€μˆ˜ var d = 2; 생성 ν›„ κ°’ 증가
        //μ–΄λŠ λ³€μˆ˜μ˜ 값이 μ¦κ°€λ κΉŒ? => ν•¨μˆ˜ λ‚΄ μš°μ„ μˆœμœ„λŠ” μ§€μ—­λ³€μˆ˜μ— μžˆλ‹€. *μœ„μΉ˜λ₯Ό 변경해도 κ²°κ³ΌλŠ” 동일
        var f1 = function(){
            d = 1;
            var d = 2;
            d++;    
            return d;
        };
        console.log(f1());
    
        //λ™μΌν•œ λ³€μˆ˜λ₯Ό μ—¬λŸ¬λ²ˆ 선언해도 μ—λŸ¬λŠ” μ—†μœΌλ©° λ§ˆμ§€λ§‰ μ°Έμ‘°λ³€μˆ˜μ— 참쑰됨.
        var e = 1;
        var e = 2;
        console.log("e : "+e);
        
        //μ€‘κ΄„ν˜Έ λ‚΄ μ„ μ–Έλœ λ³€μˆ˜λŠ” λ°–μ—μ„œ μ‚¬μš©ν•  수 μ—†λŠ”κ±΄λ° μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ˜ˆμ™Έ
        //단, ν•¨μˆ˜ λ‚΄ μ§€μ—­λ³€μˆ˜λŠ” μ œμ™Έ.
        { var f = 1; }
        console.log("f : "+ f);
        
        //ν•¨μˆ˜ μ•ˆμ—μ„œ μ„ μ–Έν•œ local, global λ³€μˆ˜
        //μ§€μ—­λ³€μˆ˜λŠ” defined λ…ΈμΆœ, μ „μ—­λ³€μˆ˜λŠ” μ •μƒλ…ΈμΆœ
        function f2(){
            var g = 1;
            // g = 1; //전역객체
            // return g;
        }
        f2();
        console.log("g : "+g);
        
        //ν΄λ‘œμ €(clouser)
        //JSλŠ” ν•¨μˆ˜ λ‚΄ ν•¨μˆ˜ μ„ μ–Έκ°€λŠ₯
        //μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šκ³  객체둜 λ§Œλ“€μ–΄ κ·Έ μžμ²΄κ°€ μ •μ˜λ‹€ 라고 μƒκ°ν•˜λ©΄ λœλ‹€.
        //ν•¨μˆ˜λ₯Ό 객체둜 λ§Œλ“€κΈ° λ•Œλ¬Έμ— κ·Έ 객체가 λ°˜ν™˜λ  수 있고, ν•¨μˆ˜ λ‚΄ ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§ˆ 수 있고
        //κ·ΈλŸ¬λ‹€λ³΄λ‹ˆ ν•¨μˆ˜κ°€ κ°€μ§€κ³  μžˆλŠ” μ§€μ—­λ³€μˆ˜κ°€ ν΄λ‘œμ €λΌλŠ” 것을 낳을 수 μžˆλ‹€.
        function f3(){
            var h = 3;
            f4();
            function f4(){
                var h = 4;
                f5();
                function f5(){
                    var h = 5;
                }
            }
        }
        console.log("f3 ν•¨μˆ˜ μ‹œμž‘");
        f3();
        // console.log("h : "+h);    
        
        function f6()
        {//block start : μ§€μ—­λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„ μ‹œμž‘
            var i = 1;
            return i;
        }//block end : μ§€μ—­λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„ 끝
        
        //f6 ν•¨μˆ˜κ°€ 호좜되고 ν•¨μˆ˜λ‚΄ μ§€μ—­λ³€μˆ˜iλŠ” 사라짐. 여기에 i의 λ³€μˆ˜λŠ” ν˜ΈμΆœν•¨μˆ˜ 값을 μ°Έμ‘°ν•œλ‹€.
        var i = f6();
        console.log("i : "+i);
        
        /**
         * 그런데 만일 μœ„μ²˜λŸΌ 값을 μ°Έμ‘°ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•œλ‹€λ©΄?
         *  1.ν•¨μˆ˜f7 λ‚΄ μ§€μ—­λ³€μˆ˜ j 객체λ₯Ό λ§Œλ“€κ³  1의 값을 μ°Έμ‘°ν•˜λ„λ‘ ν•œλ‹€.
         *  2.ν•¨μˆ˜f8을 λ¦¬ν„΄ν•˜λ„λ‘ν•œλ‹€. ν•¨μˆ˜λΈ”λ‘ 끝
         *  3.λ³€μˆ˜k 객체λ₯Ό λ§Œλ“€μ–΄ f7ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ„λ‘ ν•œλ‹€.
         *  4.λ³€μˆ˜kλŠ” ν•¨μˆ˜ 객체λ₯Ό μ°Έμ‘°ν•˜λ―€λ‘œ ν•¨μˆ˜λ‘œ 호좜이 κ°€λŠ₯ν•˜κ³  κ·Έ 값을 j λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜λ„λ‘ ν•œλ‹€.
         *  λ¬Έμ œλŠ” μ—†λŠ”κ°€?
         *  3λ²ˆμ—μ„œ λ³€μˆ˜kκ°€ f7ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ³  ν˜ΈμΆœλ˜μ–΄ f7ν•¨μˆ˜λŠ” f8ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν–ˆμœΌλ‹ˆ μ§€μ—­λ³€μˆ˜ jλ₯Ό μ‚­μ œν•˜κ³  λλ‚˜μ•Όν•œλ‹€.
         *  근데 f8ν•¨μˆ˜κ°€ ν•¨μˆ˜ μ§€μ—­λ³€μˆ˜ jλ₯Ό μ°Έμ‘°ν•˜κ³  λ¦¬ν„΄ν•˜λ €κ³  ν•œλ‹€.
         *  f8이 μ‚¬μš©μœ λ¬΄μ— 따라 jλ₯Ό μ‚­μ œν•΄μ•Όν• μ§€ μœ μ§€ν•΄μ•Όν• μ§€ JSλŠ” νŒλ‹¨ν•΄μ•Όν•œλ‹€.
         *  결둠은 μ‚­μ œλ˜μ§€ μ•Šκ³  μœ μ§€ν•œλ‹€.
         *  μ΄λ•Œ f8은 f7의 ν΄λ‘œμ € ν•¨μˆ˜κ°€ λœλ‹€.
         *  ν΄λ‘œμ € ν•¨μˆ˜λŠ” μ˜λ„ν•˜κ³  μ‚¬μš©ν•˜λ©΄ μ’‹μ§€λ§Œ κ·Έλ ‡μ§€μ•ŠμœΌλ©΄ μžμ›λ‚­λΉ„λ‚˜ μ—λŸ¬λ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 μžˆλ‹€.
         */
        function f7(){
            var j = 1;
            return function f8(){
                return j;
            }
        }
        
        var k = f7();
        var j = k();
        console.log("ν΄λ‘œμ € j : "+j);