JavaScript 자료형 Function

    2018-04-20 18:16:10 작성

    Function

    함수는 function 키워드로 정의 되고, 함수 선언식과 표현식을 사용할 수 있습니다.
    함수 선언식과 표현식, hoisting에 대해서는 기초에서 살펴 보았습니다.

    • 자체 호출 함수(즉시 실행 함수)

      함수 표현식에 ()를 붙이면 호출되지 안아도 자동으로 호출되어 집니다.
      함수 선언식은 자체 호출할 수 없습니다.
      형태 : (함수 표현식)()

      자체 호출 함수 이용하면 블로스코프를 흉내 낼수 있습니다.

    • 함수 내부 구조

      Javascript 함수는 객체이고 속성과 메소드가 있습니다. typeof 연산에서 "function"을 반환합니다.
      함수 내부에는 arguments, this라는 특별한 객체가 있습니다. arguments는 매개변수를 표현하는 것뿐만 아니라,
      arguments객체의 소유자 함수를 가리키는 포인트 callee 속성(피호출자)을 가지고 있습니다.

      callee의 활용

    • this 객체

      this는 함수가 실행중인 컨텍스트 객체에 대한 참조 입니다.
      함수를 웹페이지의 전역에서 호출했다면 this는 window객체를 가리킵니다.

    • 생성자 패턴

      new 키워드를 사용하여 함수 호출을 하면 새로운 객체를 만듭니다.

      이런한 패턴을 사용하면 객체지향 프로그래밍을 흉내 낼수 있습니다.

    • call() 메서드

      함수는 객체의 메서드 입니다.
      객체는 메서드를 소요하고 있습니다.
      call(owner) 메서드는 owner를 소유객체로 사용하여 함수를 호출하는데 사용할 수 있습니다.

    • apply() 메서드

      call() 메서드와 유사합니다. 차이점은 :

      • call() : 모든 함수 인수를 별도로 취급합니다.
      • apply() : 모든 함수 인수를 배열로 사용합니다.

      apply() 메서드는 인수 목록 대신 배열을 사용하려는 경우 편리합니다.

    • 전역변수

      자바스크립트의 변수는 전역, 지역 범위에 속 할수 있습니다.
      함수는 다음과 같이 변수에 접근할 수 있습니다.

      var 키워드 없이 작성된 변수는 항상 전역변수 입니다.(이렇게 하지 마십시오)

    • 카운터 딜레마

      전역변수와 함께 사용하여 카운터를 늘릴수 있습니다. 지역변수를 하면 카운터를 유지 할수 없습니다.(static 변수가 없음)

      이 경우 중첩 함수를 사용하면 해결할 수 있습니다.

    • 중첩 함수

      JavaScript는 중첩 함수를 지원합니다.
      모든 중첩된 함수는 상위 범위에 접근 할 수 있습니다.

      외부에서 plus 함수를 접근 할수 있다면 카운터 딜레마를 해결할 수 있습니다.
      또한 var counter = 0; 를 한번만 실행 하는 방법을 찾아야 합니다.
      이경우 클로저를 이용하면 해결할 수 있습니다.

    • 클로저

      자체 호출 함수를 사용하는 다음 코드를 보세요.

      변수 add에는 자체 호출함수의 리턴값이 저장됩니다.
      자체 호출 함수는 한번만 실행되며, counter를 0으로 초기화 하고 함수 표현식을 반환합니다.
      이렇게 하면 add는 함수가 됩니다.
      add는 상위 함수의 counter 변수에 접근이 가능합니다.
      이것을 JavaScript 클로저라고 합니다.
      counter 변수는 익명함수의 범위로 보호되며 add 함수에서 변경할 수 있습니다.

      클로저는 상위 함수가 닫힌 후에도 부모 범위에 접근하는 함수를 말합니다.

    • 클로저와 변수

      클로저는 항상 상위 함수의 마지막 저장된 값만 알수 있습니다. 다음의 코드를 보십시오

      0번 클릭시 0, 1번 클릭시 1이 나올것 처럼 보이지만 모든 버튼이 5를 출력합니다.
      이것은 모든 함수가 i를 가리키고 있기 때문입니다.
      이 문제를 해결하려면 클로저를 직접 할당 하는 대신 익명함수를 정의하고 즉시 호출합니다.