[번외] 자바스크립트 #2 - 함수

2015. 4. 25. 23:14plming/jQuery

자바스크립트에서 함수는 객체로 간주

다음과 같이 이용될 수 있다.

. 변수에 할당

. 객체의 프로퍼티에 할당

. 매개변수로 전달

. 함수의 결과값으로 반환

. 리터럴을 이용해서 생성

 

요롷게 코딩을 하지만

function doSomethingWonderful() {

  alert('!!!');

}

 

function 키워드는 자동으로 Function 인스턴스를 생성하고

가짜 함수 '이름'을 사용해서 생성한 window 프로퍼티에 할당한다.

 

doSomethingWonderful = function() {

  alert('!!!');

}

실제로는 요롷게 처리되고 있다.

 

function hello() { alert('hi'); } 또는

hello = function() { alert('hi'); } 또는

window.hello = function() { alert('hi'); }

 

 

function hello() { alert('hi'); }

setTimeout( hello, 5000 );

함수가 페이지의 여기저기에서 사용될 게 아니라면

매개변수로 전달할 Function 인스턴스를 굳이 생성하지 않아도 된다.

요롷게

setTimeout( function() { alert('hi'); }, 5000 );

 

 

. 함수에서의 this

  일반적으로는 함수를 소유한 객체를 가르키지만

  - 함수가 (객체에 포함되지 않은 채) 최상위 레벨에서 바로 호출되면,

     this가 가르키는 함수컨텍스트는 window 인스턴스이다.

  - Function의 call() 메서드에 첫 번째 매개변수로 전달된 어떤 객체라도 함수콘텍스트로 설정된다.

  - Function의 apply() 메서드도 call()과 마찬가지지만,

    두 메서드는 추가 매개변수가 함수로 전달될 때만 차이를 가진다.  어떤?

 

  function whoAmI() { return this.xxx; }

  alert( whoAmI() );  ← 이때, this는 window

  alert( o1.identifyMe() );  ← 이때, this는 o1, o1.identifyMe = whoAmI; 처리 후

  alert( whoAmI.call(o2) );  ← 이때, this는 o2

  alert( whoAmI.apply(o3) );  ← 이때, this는 o3

 

  "함수 F를 호출할 때, 함수 콘텍스트로 객체 O가 제공되면, F는 O의 메서드 역할을 한다."

  alert( o1.identifyMe.call(o3) );

 

 

. 클로저(closure)

  함수를 실행하는 데 필요한 지역변수와 결합된 Function 인스턴스

  function이 만들어질 때, function 안에서 사용된 지역변수는

  지역변수/function 선언등의 처리 Block이 실행되 버린 후에라도

  function이 수행되고 있다면

  이미 소멸되어 버렸을 것 같은 지역변수라도

  수행되고 있는 function에서 값을 정상적으로 참조할 수 있다.

  (메모리에서 해제되지 않는다.) ← 순환 참조일 경우 메모리 누수의 원인이 되기도 한다.

 

  $( function(){  ← DOM이 로드된 후 실행되는 준비핸들러
     var local = 1;
     window.setInterval( function(){
        $('#display')
        .append('<div>At '+new Date()+' local='+local+'</div>');
        local++;
     }, 3000 );
  } );
  localfunction()위에서 선언되어 function() 안에서 실행되는 데는 문제가 없어보이지만

  function()를 모두 실행한 이후에는 소멸될 것 같지만

  3초의 Interval마다 실행되도록 정의한 function()이 실행되는 동안에는

  local이 계속 살아있게 되는 것이다.

 

  이렇듯, 자바스크립트에서 클로저는 별도의 특별한 문법을 쓰지 않고도 암묵적으로 생긴다.

 

  비동기 콜백을 활용하는 jQuery 커맨드를 이용할 때 클로저가 절대적으로 필요하고

  특히 Ajax요청이나 이벤트 처리에서 중요하다.

 

 

'plming > jQuery' 카테고리의 다른 글

DOM 레벨2 이벤트 모델  (0) 2015.05.03
DOM 레벨0 이벤트 모델  (0) 2015.05.03
[번외] 자바스크립트 #1 - 객체  (0) 2015.04.24
폼 엘리먼트 값 다루기  (0) 2015.04.24
엘리먼트 콘텐츠 설정하기  (0) 2015.04.23