SlideShare una empresa de Scribd logo
1 de 20
Descargar para leer sin conexión
Javascript Closure의 이해




       윤지수




2012년 6월 20일 수요일
문서의 목표 !


       Closure가 어떤 것인지 이해하고,
       이를 잘못 사용하면 어떤 문제가 생기는지,
       그 해법은 무엇인지 이해한다




2012년 6월 20일 수요일
관련 지식

       1. Functional Programming
       >   함수가 인자나 반환값으로도 사용 될 수 있는 프로그래밍 방식으로, 보다 확장성있는 코드구현이 가능

       2. Execution Context
       > 함수가 실행되는 경우 동작에 필요한 정보를 담고 있는 가상의 공간 (추상화된 개념)
       > Value Object 라고도 함


       3. Immediate Function
       >   익명함수라고도 하며 “(function(){ })()” 와 같은 syntax를 가지고 있음
       >   별도 Execution Context영역을 가지고 있어 private한 코드를 작성할 때 유용




2012년 6월 20일 수요일
Closure - 이해하기
       사전 지식 - Javascript의 지역변수와 전역변수

       1.   ‘var’ keyword로 선언한 지역변수는 함수 내부에서만 그 유효범위를 가짐
       2.   지역변수를 외부에서 사용하려면 전역변수로 선언해야 함
       3.   전역변수는 코드통합에 문제가 생겨 그 사용을 지양함
       4.   전역변수를 사용하지 않고도 지역변수를 함수 외부에서 사용 ??




2012년 6월 20일 수요일
Closure - 이해하기
       사전 지식 - Javascript의 지역변수와 전역변수

       1.   ‘var’ keyword로 선언한 지역변수는 함수 내부에서만 그 유효범위를 가짐
       2.   지역변수를 외부에서 사용하려면 전역변수로 선언해야 함
       3.   전역변수는 코드통합에 문제가 생겨 그 사용을 지양함
       4.   전역변수를 사용하지 않고도 지역변수를 함수 외부에서 사용 ??

            : Closure로 가능




2012년 6월 20일 수요일
Closure - 이해하기
       Closure 란 ?

       1. Closure에 대한 여러가지 정의들
       >   함수가 정의되는 순간의 환경을 기억하는 함수. 즉 함수 외부에 선언된 변수를 참조하는 함수
       >   Closure는 변수 자신들이 바인드되는 환경에 한정되지 않는 변수를 가지는 표현식
       > 자신이 생성된 함수의 context에 직접 접근(참조)할 수 있는 함수




                              Context
                    Context




2012년 6월 20일 수요일
Closure - 이해하기
       Closure 란 ?

       1. Closure에 대한 여러가지 정의들
       >   함수가 정의되는 순간의 환경을 기억하는 함수. 즉 함수 외부에 선언된 변수를 참조하는 함수
       >   Closure는 변수 자신들이 바인드되는 환경에 한정되지 않는 변수를 가지는 표현식
       > 자신이 생성된 함수의 context에 직접 접근(참조)할 수 있는 함수




                                        Closure는,
                              Context
                                        함수라고도 하고,
                    Context
                                        상황이라고도 하고,
                                        유효범위(scope or code block)
                                        라고도 함
2012년 6월 20일 수요일
Closure - 이해하기
       Closure 예제 코드- 지역변수를 참조하는 예

        function outer() {
          var localVar = 1;
          return function closureFun() {
                    return localVar ++;
                 };

        }

        var funtypevar = outer();
        functypevar();



       1.closureFun 는 closure function으로, outer function이 반환하여 실행 함
       2.closureFun 는 outer함수 context의 localVar를 참조하고 있음




2012년 6월 20일 수요일
Closure - 이해하기
       Closure 예제 코드 - 지역변수를 참조하는 예
        function outer() {
          var innervar = 1;
          return function closureFun() {
                    return innervar++;
                 };
        }
        var funtypevar = outer();
        functypevar();



                   outer context                         outer context
                   variable innervar
                                                          variable innervar
                                           Call
                                          outer();
              closureFun context       functypevar()

                                                        closureFun context



       closureFun context에서 outer context를 계속 참조하고 있음


2012년 6월 20일 수요일
Closure - 이해하기
       Closure 예제 코드 - 지역함수를 참조하는 예
       지역변수 뿐만 아니라, 함수내 지역함수(inner function)에도 접근(참조)


        function outer() {
          var innervar = 1;
          function inner () {
            return innervar + 10;
          }

            return function closureFun() {
                      var value1 = inner;
                      return value1;
                   };

        }




2012년 6월 20일 수요일
Closure - 이해하기
       Closure 예제 코드 - 지역함수를 참조하는 예
       function outer() {
         var innervar = 1;
         function inner () {
           return innervar + 10;
         }

          return function closureFun() {
                    var value1 = inner;
                    return value1;
                 };

       }
       var innerVal = outer();         //function inner body
       innerVal()(); // 11



                   outer context                                         outer context
                   variable innervar
                                                                          variable innervar
                                                 Call “outer function”
                   inner context                        outer();           inner context

               closureFun context                                                   innervar, inner
                                                                                         참조

                                                                         closureFun context


       closureFun context에서 outer context의 inner함수와, innervar변수를 계속 참조하고 있음

2012년 6월 20일 수요일
Closure - 이해하기
       Closure 예제 코드 - 비동기 상황의 예1
       > event handler
       > setTimeout



       event handler 를 loop를 통해서 등록하는 예

        window.onload = function() {
            for(var i=1; i < 3; i++ ) {
                document.getElementById("btn" + i).
                addEventListener("click” ,function() { alert(i); },
                false);
             }
        }




2012년 6월 20일 수요일
Closure - 이해하기
       Closure 예제 코드 - 비동기 상황의 예2
       > event handler
       > setTimeout



       settimeout 함수에 callback으로 등록 하는 예
        function testfun() {
          var x = 10;
          window.setTimeout(function(){
            alert(x);
            x++;
          }, 5000);

            window.setTimeout(function(){
              alert(x);
            }, 10000);

            alert("end of function")
        }

        testfun();    //”end of function” --> 10 --> 11 순으로 출력


2012년 6월 20일 수요일
Closure - 이해하기
       Closure를 좀더 잘 알아야 할 이유 !

       Closure는 문제를 일으킬 수 있는 부분이 있어 주의해야하며,
       활용 방법에 따라 언어의 단점을 보완할 수도 있음


       1. 주의 할 점
       >   Closure를 잘못 사용해서 생기는 오류를 조심해야 함


       2. 장점 활용
       Javascript 언어의 단점중 하나인 ‘전역변수’로 인한 문제를 Closure를 통해 해결할 수 있음




2012년 6월 20일 수요일
Closure - 이해하기
       주의 할 점 - Closure 여러번 호출하기
       상황
       Closure function를 여러번 호출해야 하는 경우

       function outer() {
         var innervar = 1;
         return function closureFun() {

                        return innervar++;
                   };

       }

       var innerfun = outer();
       var temp1 = innerfun();
       var temp2 = innerfun();
       var temp3 = innerfun();
       console.log(temp1+ " : " + temp2 + " : " + temp3);

       > temp1, temp2, temp3은 각각 어떤 값을 가지게 될까요?



2012년 6월 20일 수요일
Closure - 이해하기
       주의 할 점 - Closure 여러번 호출하기
       상황
       Closure function를 여러번 호출해야 하는 경우

       function outer() {
         var innervar = 1;
         return function closureFun() {

                        return innervar++;
                   };

       }

       var innerfun = outer();
       var temp1 = innerfun();
       var temp2 = innerfun();
       var temp3 = innerfun();
       console.log(temp1+ " : " + temp2 + " : " + temp3);

       > 각각 1,2,3 이 출력. innervalue 변수를 참조하여 계속 증가 됨



2012년 6월 20일 수요일
Closure - 이해하기
       주의 할 점 - 잘못된 사용의 예
       상황
       화면의 두개의 button UI를 클릭하면 각각 다른 값을 출력
       : 1번버튼을 누르면 1을 출력, 2번버튼을 누르면 2를 출력


        window.onload = function() {
            for(var i=1; i < 3; i++ ) {
                document.getElementById("btn" + i). //btn1,btn2 이라는 id를 가진 태그 찾기
                addEventListener("click",           //click Event listener
                   function() { alert(i); },        //Event handler등록 (각 번호를 출력)
                false);
             }
        }




       > button을 두 개를 클릭 할 때 각각 어떤 값이 노출될까요?




2012년 6월 20일 수요일
Closure - 이해하기
       주의 할 점 - 잘못된 사용의 예
        window.onload = function() {
            for(var i=1; i < 3; i++ ) {
                document.getElementById("btn" + i). //btn1,btn2 이라는 id를 가진 태그 찾기
                addEventListener("click",           //click Event listener
                   function() { alert(i); },        //Event handler등록 (각 번호를 출력)
                false);
             }
        }


         i = 1 일때
        btn1 -> function(){alert(1)}

         i = 2 일때
        btn2 -> function(){alert(2)}
        btn1 -> function(){alert(2)}     // 참조하고 있는 i가 2로 변경

         i++   구문 통과 후 i = 3 일때
        btn3   -> function(){alert(3)}
        btn2   -> function(){alert(3)}   // 참조하고 있는 i가 3으로 변경
        btn1   -> function(){alert(3)}   // 참조하고 있는 i가 3으로 변경




       > i 는 참조 된 것으로 그 값이 변경되는 경우 계속 업데이트 반영 됨

2012년 6월 20일 수요일
Closure - 이해하기
       주의 할 점 - 잘못된 사용의 해결
       참조하고 있는 변수(i)의 관계를 끊기
       >immediate function을 활용하면서 중간과정에서 별도 파라미터를(otherVal) 통해 클로저 상황이 아닌 다른 메모리 영
       역을 바라보게 함




       window.onload = function() {
           for(var i=1; i < 3; i++ ) {
             (function(otherVal) {
               document.getElementById("btn" + otherVal).addEventListener("click",function() {
                   alert(otherVal);
               }, false);
             })(i);
           }
       }




        i의 값은 인자로 할당되지만 otherVal라는 변수로 대체되어 event handler
        로 등록된다. 이것은 변수 i의 참조와의 연결을 끊는 것임




2012년 6월 20일 수요일
End




       참고 사이트
       본문의 내용/소스코드 일부는 아래 사이트에서 참고 되었습니다

       http://en.wikipedia.org/wiki/Closure_(computer_science)
       http://blog.outsider.ne.kr/506
       http://blog.naver.com/bitofsky/50116354883?viewType=pc
       http://msdn.microsoft.com/en-us/magazine/ff696765.aspx
       http://nodejs-kr.org/insidejs/archives/508




2012년 6월 20일 수요일

Más contenido relacionado

La actualidad más candente

파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229Yong Joon Moon
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초진수 정
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229Yong Joon Moon
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeYoung-Beom Rhee
 
파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131Yong Joon Moon
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
Reflect package 사용하기
Reflect package 사용하기Reflect package 사용하기
Reflect package 사용하기Yong Joon Moon
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Circulus
 
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It종빈 오
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsSeok-joon Yun
 
PPL: Composing Tasks
PPL: Composing TasksPPL: Composing Tasks
PPL: Composing Tasks용준 김
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
파이썬 sqlite 이해하기
파이썬 sqlite 이해하기파이썬 sqlite 이해하기
파이썬 sqlite 이해하기Yong Joon Moon
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자Circulus
 
파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301Yong Joon Moon
 

La actualidad más candente (20)

파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229파이썬+함수 데코레이터+이해하기 20160229
파이썬+함수 데코레이터+이해하기 20160229
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
 
파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
Reflect package 사용하기
Reflect package 사용하기Reflect package 사용하기
Reflect package 사용하기
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threads
 
PPL: Composing Tasks
PPL: Composing TasksPPL: Composing Tasks
PPL: Composing Tasks
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
파이썬 sqlite 이해하기
파이썬 sqlite 이해하기파이썬 sqlite 이해하기
파이썬 sqlite 이해하기
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
 
파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301파이썬+Json+이해하기 20160301
파이썬+Json+이해하기 20160301
 

Similar a Javascript Closure

헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
Hello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and EnumHello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and EnumCody Yun
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js functionYoung-Beom Rhee
 
Swift 3 Programming for iOS : Closure
Swift 3 Programming for iOS  : ClosureSwift 3 Programming for iOS  : Closure
Swift 3 Programming for iOS : ClosureKwang Woo NAM
 
Clojure programming-김민지
Clojure programming-김민지Clojure programming-김민지
Clojure programming-김민지ETRIBE_STG
 
[JS] Function.prototype.bind
[JS] Function.prototype.bind[JS] Function.prototype.bind
[JS] Function.prototype.bindJinhyuck Kim
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3david nc
 
[Live coding] 2회 5 23 (camp-exam_javalanguage)
[Live coding] 2회 5 23 (camp-exam_javalanguage)[Live coding] 2회 5 23 (camp-exam_javalanguage)
[Live coding] 2회 5 23 (camp-exam_javalanguage)동욱 하
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With GroovyTommy C. Kang
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalSecrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalHyuncheol Jeon
 

Similar a Javascript Closure (13)

헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
Hello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and EnumHello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and Enum
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
 
Swift 3 Programming for iOS : Closure
Swift 3 Programming for iOS  : ClosureSwift 3 Programming for iOS  : Closure
Swift 3 Programming for iOS : Closure
 
Clojure programming-김민지
Clojure programming-김민지Clojure programming-김민지
Clojure programming-김민지
 
[JS] Function.prototype.bind
[JS] Function.prototype.bind[JS] Function.prototype.bind
[JS] Function.prototype.bind
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 
[Live coding] 2회 5 23 (camp-exam_javalanguage)
[Live coding] 2회 5 23 (camp-exam_javalanguage)[Live coding] 2회 5 23 (camp-exam_javalanguage)
[Live coding] 2회 5 23 (camp-exam_javalanguage)
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalSecrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
 
8 swift 중첩함수
8 swift 중첩함수8 swift 중첩함수
8 swift 중첩함수
 

Más de 지수 윤

코드스쿼드 마스터즈세미나 - UI개발자가돼보자
코드스쿼드 마스터즈세미나 - UI개발자가돼보자코드스쿼드 마스터즈세미나 - UI개발자가돼보자
코드스쿼드 마스터즈세미나 - UI개발자가돼보자지수 윤
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development지수 윤
 
개발자를 알아보자.
개발자를 알아보자.개발자를 알아보자.
개발자를 알아보자.지수 윤
 
재사용UI 컴포넌트설계
재사용UI 컴포넌트설계재사용UI 컴포넌트설계
재사용UI 컴포넌트설계지수 윤
 
Front-End 개발의 괜찮은 선택 ES6 & React
Front-End 개발의 괜찮은 선택  ES6 & ReactFront-End 개발의 괜찮은 선택  ES6 & React
Front-End 개발의 괜찮은 선택 ES6 & React지수 윤
 
WEB Front-End 개발과정 살펴보기
WEB Front-End 개발과정 살펴보기WEB Front-End 개발과정 살펴보기
WEB Front-End 개발과정 살펴보기지수 윤
 
크로스브라우징
크로스브라우징크로스브라우징
크로스브라우징지수 윤
 
재사용가능한 서비스코드제작
재사용가능한 서비스코드제작재사용가능한 서비스코드제작
재사용가능한 서비스코드제작지수 윤
 
WEBUI Advanced중간시험
WEBUI Advanced중간시험WEBUI Advanced중간시험
WEBUI Advanced중간시험지수 윤
 
비동기와 이벤트큐 수업자료
비동기와 이벤트큐 수업자료비동기와 이벤트큐 수업자료
비동기와 이벤트큐 수업자료지수 윤
 
JavaScript OOP Pattern
JavaScript OOP PatternJavaScript OOP Pattern
JavaScript OOP Pattern지수 윤
 
JS특징(scope,this,closure)
JS특징(scope,this,closure)JS특징(scope,this,closure)
JS특징(scope,this,closure)지수 윤
 
JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)지수 윤
 
JavaScript Debugging (동영상강의자료)
JavaScript Debugging (동영상강의자료)JavaScript Debugging (동영상강의자료)
JavaScript Debugging (동영상강의자료)지수 윤
 
더 나은 SW프로젝트를 위해
 더 나은 SW프로젝트를 위해 더 나은 SW프로젝트를 위해
더 나은 SW프로젝트를 위해지수 윤
 
9주 DOM & Event Advanced
9주  DOM & Event Advanced9주  DOM & Event Advanced
9주 DOM & Event Advanced지수 윤
 
7주 JavaScript Part2
7주 JavaScript Part27주 JavaScript Part2
7주 JavaScript Part2지수 윤
 
7주 JavaScript Part1
7주 JavaScript Part17주 JavaScript Part1
7주 JavaScript Part1지수 윤
 

Más de 지수 윤 (20)

HTML,CSS Next
HTML,CSS NextHTML,CSS Next
HTML,CSS Next
 
코드스쿼드 마스터즈세미나 - UI개발자가돼보자
코드스쿼드 마스터즈세미나 - UI개발자가돼보자코드스쿼드 마스터즈세미나 - UI개발자가돼보자
코드스쿼드 마스터즈세미나 - UI개발자가돼보자
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development
 
개발자를 알아보자.
개발자를 알아보자.개발자를 알아보자.
개발자를 알아보자.
 
재사용UI 컴포넌트설계
재사용UI 컴포넌트설계재사용UI 컴포넌트설계
재사용UI 컴포넌트설계
 
Front-End 개발의 괜찮은 선택 ES6 & React
Front-End 개발의 괜찮은 선택  ES6 & ReactFront-End 개발의 괜찮은 선택  ES6 & React
Front-End 개발의 괜찮은 선택 ES6 & React
 
WEB Front-End 개발과정 살펴보기
WEB Front-End 개발과정 살펴보기WEB Front-End 개발과정 살펴보기
WEB Front-End 개발과정 살펴보기
 
크로스브라우징
크로스브라우징크로스브라우징
크로스브라우징
 
재사용가능한 서비스코드제작
재사용가능한 서비스코드제작재사용가능한 서비스코드제작
재사용가능한 서비스코드제작
 
WEBUI Advanced중간시험
WEBUI Advanced중간시험WEBUI Advanced중간시험
WEBUI Advanced중간시험
 
비동기와 이벤트큐 수업자료
비동기와 이벤트큐 수업자료비동기와 이벤트큐 수업자료
비동기와 이벤트큐 수업자료
 
JavaScript OOP Pattern
JavaScript OOP PatternJavaScript OOP Pattern
JavaScript OOP Pattern
 
JS특징(scope,this,closure)
JS특징(scope,this,closure)JS특징(scope,this,closure)
JS특징(scope,this,closure)
 
JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)JavaScript Debugging (수업자료)
JavaScript Debugging (수업자료)
 
JavaScript Debugging (동영상강의자료)
JavaScript Debugging (동영상강의자료)JavaScript Debugging (동영상강의자료)
JavaScript Debugging (동영상강의자료)
 
CSS Layout
CSS LayoutCSS Layout
CSS Layout
 
더 나은 SW프로젝트를 위해
 더 나은 SW프로젝트를 위해 더 나은 SW프로젝트를 위해
더 나은 SW프로젝트를 위해
 
9주 DOM & Event Advanced
9주  DOM & Event Advanced9주  DOM & Event Advanced
9주 DOM & Event Advanced
 
7주 JavaScript Part2
7주 JavaScript Part27주 JavaScript Part2
7주 JavaScript Part2
 
7주 JavaScript Part1
7주 JavaScript Part17주 JavaScript Part1
7주 JavaScript Part1
 

Javascript Closure

  • 1. Javascript Closure의 이해 윤지수 2012년 6월 20일 수요일
  • 2. 문서의 목표 ! Closure가 어떤 것인지 이해하고, 이를 잘못 사용하면 어떤 문제가 생기는지, 그 해법은 무엇인지 이해한다 2012년 6월 20일 수요일
  • 3. 관련 지식 1. Functional Programming > 함수가 인자나 반환값으로도 사용 될 수 있는 프로그래밍 방식으로, 보다 확장성있는 코드구현이 가능 2. Execution Context > 함수가 실행되는 경우 동작에 필요한 정보를 담고 있는 가상의 공간 (추상화된 개념) > Value Object 라고도 함 3. Immediate Function > 익명함수라고도 하며 “(function(){ })()” 와 같은 syntax를 가지고 있음 > 별도 Execution Context영역을 가지고 있어 private한 코드를 작성할 때 유용 2012년 6월 20일 수요일
  • 4. Closure - 이해하기 사전 지식 - Javascript의 지역변수와 전역변수 1. ‘var’ keyword로 선언한 지역변수는 함수 내부에서만 그 유효범위를 가짐 2. 지역변수를 외부에서 사용하려면 전역변수로 선언해야 함 3. 전역변수는 코드통합에 문제가 생겨 그 사용을 지양함 4. 전역변수를 사용하지 않고도 지역변수를 함수 외부에서 사용 ?? 2012년 6월 20일 수요일
  • 5. Closure - 이해하기 사전 지식 - Javascript의 지역변수와 전역변수 1. ‘var’ keyword로 선언한 지역변수는 함수 내부에서만 그 유효범위를 가짐 2. 지역변수를 외부에서 사용하려면 전역변수로 선언해야 함 3. 전역변수는 코드통합에 문제가 생겨 그 사용을 지양함 4. 전역변수를 사용하지 않고도 지역변수를 함수 외부에서 사용 ?? : Closure로 가능 2012년 6월 20일 수요일
  • 6. Closure - 이해하기 Closure 란 ? 1. Closure에 대한 여러가지 정의들 > 함수가 정의되는 순간의 환경을 기억하는 함수. 즉 함수 외부에 선언된 변수를 참조하는 함수 > Closure는 변수 자신들이 바인드되는 환경에 한정되지 않는 변수를 가지는 표현식 > 자신이 생성된 함수의 context에 직접 접근(참조)할 수 있는 함수 Context Context 2012년 6월 20일 수요일
  • 7. Closure - 이해하기 Closure 란 ? 1. Closure에 대한 여러가지 정의들 > 함수가 정의되는 순간의 환경을 기억하는 함수. 즉 함수 외부에 선언된 변수를 참조하는 함수 > Closure는 변수 자신들이 바인드되는 환경에 한정되지 않는 변수를 가지는 표현식 > 자신이 생성된 함수의 context에 직접 접근(참조)할 수 있는 함수 Closure는, Context 함수라고도 하고, Context 상황이라고도 하고, 유효범위(scope or code block) 라고도 함 2012년 6월 20일 수요일
  • 8. Closure - 이해하기 Closure 예제 코드- 지역변수를 참조하는 예 function outer() { var localVar = 1; return function closureFun() { return localVar ++; }; } var funtypevar = outer(); functypevar(); 1.closureFun 는 closure function으로, outer function이 반환하여 실행 함 2.closureFun 는 outer함수 context의 localVar를 참조하고 있음 2012년 6월 20일 수요일
  • 9. Closure - 이해하기 Closure 예제 코드 - 지역변수를 참조하는 예 function outer() { var innervar = 1; return function closureFun() { return innervar++; }; } var funtypevar = outer(); functypevar(); outer context outer context variable innervar variable innervar Call outer(); closureFun context functypevar() closureFun context closureFun context에서 outer context를 계속 참조하고 있음 2012년 6월 20일 수요일
  • 10. Closure - 이해하기 Closure 예제 코드 - 지역함수를 참조하는 예 지역변수 뿐만 아니라, 함수내 지역함수(inner function)에도 접근(참조) function outer() { var innervar = 1; function inner () { return innervar + 10; } return function closureFun() { var value1 = inner; return value1; }; } 2012년 6월 20일 수요일
  • 11. Closure - 이해하기 Closure 예제 코드 - 지역함수를 참조하는 예 function outer() { var innervar = 1; function inner () { return innervar + 10; } return function closureFun() { var value1 = inner; return value1; }; } var innerVal = outer(); //function inner body innerVal()(); // 11 outer context outer context variable innervar variable innervar Call “outer function” inner context outer(); inner context closureFun context innervar, inner 참조 closureFun context closureFun context에서 outer context의 inner함수와, innervar변수를 계속 참조하고 있음 2012년 6월 20일 수요일
  • 12. Closure - 이해하기 Closure 예제 코드 - 비동기 상황의 예1 > event handler > setTimeout event handler 를 loop를 통해서 등록하는 예 window.onload = function() { for(var i=1; i < 3; i++ ) { document.getElementById("btn" + i). addEventListener("click” ,function() { alert(i); }, false); } } 2012년 6월 20일 수요일
  • 13. Closure - 이해하기 Closure 예제 코드 - 비동기 상황의 예2 > event handler > setTimeout settimeout 함수에 callback으로 등록 하는 예 function testfun() { var x = 10; window.setTimeout(function(){ alert(x); x++; }, 5000); window.setTimeout(function(){ alert(x); }, 10000); alert("end of function") } testfun(); //”end of function” --> 10 --> 11 순으로 출력 2012년 6월 20일 수요일
  • 14. Closure - 이해하기 Closure를 좀더 잘 알아야 할 이유 ! Closure는 문제를 일으킬 수 있는 부분이 있어 주의해야하며, 활용 방법에 따라 언어의 단점을 보완할 수도 있음 1. 주의 할 점 > Closure를 잘못 사용해서 생기는 오류를 조심해야 함 2. 장점 활용 Javascript 언어의 단점중 하나인 ‘전역변수’로 인한 문제를 Closure를 통해 해결할 수 있음 2012년 6월 20일 수요일
  • 15. Closure - 이해하기 주의 할 점 - Closure 여러번 호출하기 상황 Closure function를 여러번 호출해야 하는 경우 function outer() { var innervar = 1; return function closureFun() { return innervar++; }; } var innerfun = outer(); var temp1 = innerfun(); var temp2 = innerfun(); var temp3 = innerfun(); console.log(temp1+ " : " + temp2 + " : " + temp3); > temp1, temp2, temp3은 각각 어떤 값을 가지게 될까요? 2012년 6월 20일 수요일
  • 16. Closure - 이해하기 주의 할 점 - Closure 여러번 호출하기 상황 Closure function를 여러번 호출해야 하는 경우 function outer() { var innervar = 1; return function closureFun() { return innervar++; }; } var innerfun = outer(); var temp1 = innerfun(); var temp2 = innerfun(); var temp3 = innerfun(); console.log(temp1+ " : " + temp2 + " : " + temp3); > 각각 1,2,3 이 출력. innervalue 변수를 참조하여 계속 증가 됨 2012년 6월 20일 수요일
  • 17. Closure - 이해하기 주의 할 점 - 잘못된 사용의 예 상황 화면의 두개의 button UI를 클릭하면 각각 다른 값을 출력 : 1번버튼을 누르면 1을 출력, 2번버튼을 누르면 2를 출력 window.onload = function() { for(var i=1; i < 3; i++ ) { document.getElementById("btn" + i). //btn1,btn2 이라는 id를 가진 태그 찾기 addEventListener("click", //click Event listener function() { alert(i); }, //Event handler등록 (각 번호를 출력) false); } } > button을 두 개를 클릭 할 때 각각 어떤 값이 노출될까요? 2012년 6월 20일 수요일
  • 18. Closure - 이해하기 주의 할 점 - 잘못된 사용의 예 window.onload = function() { for(var i=1; i < 3; i++ ) { document.getElementById("btn" + i). //btn1,btn2 이라는 id를 가진 태그 찾기 addEventListener("click", //click Event listener function() { alert(i); }, //Event handler등록 (각 번호를 출력) false); } } i = 1 일때 btn1 -> function(){alert(1)} i = 2 일때 btn2 -> function(){alert(2)} btn1 -> function(){alert(2)} // 참조하고 있는 i가 2로 변경 i++ 구문 통과 후 i = 3 일때 btn3 -> function(){alert(3)} btn2 -> function(){alert(3)} // 참조하고 있는 i가 3으로 변경 btn1 -> function(){alert(3)} // 참조하고 있는 i가 3으로 변경 > i 는 참조 된 것으로 그 값이 변경되는 경우 계속 업데이트 반영 됨 2012년 6월 20일 수요일
  • 19. Closure - 이해하기 주의 할 점 - 잘못된 사용의 해결 참조하고 있는 변수(i)의 관계를 끊기 >immediate function을 활용하면서 중간과정에서 별도 파라미터를(otherVal) 통해 클로저 상황이 아닌 다른 메모리 영 역을 바라보게 함 window.onload = function() {     for(var i=1; i < 3; i++ ) { (function(otherVal) {         document.getElementById("btn" + otherVal).addEventListener("click",function() {             alert(otherVal);         }, false);     })(i); } } i의 값은 인자로 할당되지만 otherVal라는 변수로 대체되어 event handler 로 등록된다. 이것은 변수 i의 참조와의 연결을 끊는 것임 2012년 6월 20일 수요일
  • 20. End 참고 사이트 본문의 내용/소스코드 일부는 아래 사이트에서 참고 되었습니다 http://en.wikipedia.org/wiki/Closure_(computer_science) http://blog.outsider.ne.kr/506 http://blog.naver.com/bitofsky/50116354883?viewType=pc http://msdn.microsoft.com/en-us/magazine/ff696765.aspx http://nodejs-kr.org/insidejs/archives/508 2012년 6월 20일 수요일