2015년 2월 17일 화요일

[난해한 Javascript 개념] first-class function

C/C++/Java에 익숙한 나에게 낯선 것들이 Javascript에는 너무나 많다. 지금까지 다루어 본 언어들과는 너무나 다른 functional 프로그래밍 언어인 Javascript의 핵심 요소를 살펴보고 '내 나름대로의 이해'를 시도해 본다.

낯선 것들:
  • first-class function

  • 변수의 scope

  • this 키워드의 의미

  • closure의 개념

  • 비동기적 프로그래밍과 callback






  • first-class function란?
    javascript의 함수는 first-class function라고 한다. first-class function은 C/C++/Java에서 들어본 적이 없는 용어인데, 함수가 다른 함수의 argument로 사용되거나, 다른 함수의 return으로 사용될 수 있다는 의미이다.
    function add(a, b, callback){ 
     var out = a + b;
     callback(out); //실행
    }
    add(1,2,function(o){ //anonymous function을  argument로 넘기기
     console.log(o);
    });
    

    아래와 같이 함수는 변수에 대입되는 것도 가능하다.
    function add(a, b, callback){ 
     var out = a + b;
     callback(out);//실행
    }
    var logf = function(o){ //변수에 대입
     console.log(o);
    });
    
    add(1,2,logf); //argument로 넘기기 
    

    아래와 같이 validation의 대상이 되는 것도 가능하다.
    function add(a, b, callback){ 
     var out = a + b;
     if(callback) //validate
      callback(out); //실행
    }
    var logf = function(o){
     console.log(o);
    });
    
    add(1,2,logf); //argument로 넘기기 
    add(4,5);
    

    함수를 return하여 실행하는 것도 가능하다.
    var foo = function (errorcode){ 
     var make_error = function(){
       console.log('error code: ' + errorcode);
     };
     return make_error; //함수를 return
    }
    var goo = foo('300'); //return된 함수를 goo에 대입
    goo(); // 'error code: 300' 출력 
    

    위에서 살펴본 바와 같이 Javascript의 함수는 C/C++/Java 언어와는 달리 하나의 객체로써 처리된다고 생각하는 것이 좋다. 생성도 되고, 변수에 대입도 되고, argument나 return으로 넘겨질 수 있다. ()를 붙임으로써 실행이 된다라는 것도 다른 언어와 다른 점이다. 즉, 객체로써 취급되다가 ()를 붙여야만 비로소 C/C++/Java의 함수처럼 'execute'된다는 것이다.

    위와 같이, 객체처럼 정의(생성?)되는 시점과 실행 시점의 차이로 인해 this 키워드의 의미가 C++/Java와 다르며, closure라는 개념이 필요하다.(내 방식대로 이해한 내용이므로 정확하지 않을 수 있다.)

    정리

    1. Javascript의 함수는 객체로써 취급된다. (생성, 변수에 대입, 다른 함수의 argument나 return으로 사용 가능)

    2. ()가 붙지 않은 function은 객체라는 의미이며 ()를 붙이면 실행하는 것이다.

    댓글 없음: