ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JavaScript] 07. 함수 표현식
    프로그래밍/JavaScript 2014. 5. 28. 16:20
    반응형

    < 프론트엔드 개발자를 위한 자바스크립트> (2013 인사이트, 한선용 옮김) 의 책을 요약한 내용으로 자바스크립트 제대로 배우기 스터디 그룹(페이스북) 의 글입니다.



    이 장에서 다루는 내용

    - 함수 표현식의 특징

    - 함수와 재귀

    - 클로저를 이용한 고유 변수

    * 함수 표현식은 자바스크립트에서 가장 강력하면서도 혼란스러운 부분중 하나인데 5장에서 설명하였듯이 함수를 정의하는 방법은 함수 선언과 함수 표현식 두가지이다. 첫 번째 방법인 함수 선언은 function 키워드 다음에 함수 이름을 쓰는 형태이다. 두 번째 방법으로는 함수 표현식을 사용하는 방법인데 함수 표현식 패턴은 일반적인 변수 할당과 거의 비슷하다.




    7.1 재귀

    - 재귀함수는 일반적으로 함수가 자기 자신을 이름으로 호출하는 형태로 이루어져 있다.


    7.2 클로저

    - 익명함수와 클로저는 자주 잘못 혼용되는데 클로저는 다른 함수의 스코프에 있는 변수에 접근 가능한 함수이다.

    - 클로저는 외부 함수의 스코프를 보관해야 하므로 다른 함수에 비해 메모리를 많이 요구한다.

    - 클로저를 과용하면 메모리에 문제가 생길 수 있으니 반드시 필요할 때만 사용하길 권장

    - 크롬 V8처럼 자바스크립트 코드를 최적화하는 엔진은 클로저 때문에 반환 불가능해진 메모리를 회수하려 시도하기도 하지만 클로저를 쓸 때는 조심하는 편이 상책


    7.2.1 클로저와 변수

    - 스코프 체인에는 한 가지 부작용이 있는데 클로저는 항상 외부 함수의 변수에 마지막으로 저장된 값만 알 수 있다.

    - 클로저는 특정 변수가 아니라 전체 변수 객체에 대한 참조를 저장한다.




    7.2.2 this 객체

    - 클로저 내부의 this 객체는 복잡하게 동작하는데 런타임에서 함수가 실행 중인 컨텍스트에 묶인다.

    - 전역 함수에서 this는 스트릭트 모드가 아닐때는 window, 스트립트 모드에서는 undefined이며 함수가 객체 메서드로 호출되었을 때 this는 해당 객체이다.

    - 이 컨텍스트에서 익명 함수는 특정 객체에 묶여 있지 않으므로 스트릭트 모드가 아니라면 this 객체는 windows 이며 스트릭트 모드에서는 undefined이다.

    - 클로저를 작성하는 방식때문에 구분이 어렵다.

    - 외부 스코프의 매개변수 객체에 접근해야한다면 클로저에서 접근할 수 있도록 참조를 다른 변수에 저장해야한다.


    7.2.3 메모리 누수

    - 클로저는 IE9 이전 버전에서 메모리 문제를 일으키는데 이는 JScript 객체와 COM 객체에서 사용하는 가비지 컬렉션 방법이 다르기 때문이다.


    7.3 블록 스코프 흉내내기

    - 자바스크립트에는 블록 레벨 스코프라는 개념이 없으므로 블록 문장에서 정의한 변수는 해당 문장이 아니라 외부 함수에 묶인다.

    - 자바스크립트는 같은 변수를 다시 선언하더라도 에러를 내지 않으며 단순히 선언을 무시한다. (선언과 동시에 하는 초기화는 적용)

    - 익명 함수를 통해 블록 스코프를 흉내 내서 이 문제를 해결 가능하다.


    7.4 고유 변수

    - 자바스크립트에는 고유 구성원(Private Member)란 개념이 없으며 객체 프로퍼티는 모두 공용이다.

    - 고유 변수라는 개념이 있는데 함수안에서 정의한 변수는 함수 밖에서 접근이 불가능 하므로 모두 고유 변수라고 간주한다. (함수 매개변수, 지역 변수, 내부 함수)

    - 특권 메서드는 고유 변수/함수에 접근 가능한 공용 메서드이다.


    7.4.1 정적 고유 변수

    - 특구너 메서드는 고유 변수나 함수를 정의할 때 쓰는 고유 스코프를 통해서 생성할수도 있다.

    - 정적 고유 변수를 생성하면 각 인스턴스가 독립 변수를 가질 수는없지만 프로토타입을 통하여 코드 재사용성이 좋아진다.


    7.4.2 모듈 패턴

    - 이전 패턴에서는 커스텀 타입에 사용할 고유 변수와 특권 메서드를 만들었다.

    - 모듈 패턴은 싱글톤에서 같은 일은 하는데 싱글톤이란 인스턴스를 단 하나만 갖게 의도된 객체이다.

    - 웹 애플리케이션에서는 애플리케이션 레벨의 정보를 관리할 싱글톤을 두는 경우가 많다.

    - 싱글톤은 일반적으로 함수에 매개변수로 전달하기보다는 전역에서 접근한다.


    7.3.4 모듈 확장 패턴

    - 모듈 패턴에서 한 가지 살펴볼 것은 객체를 반환하기 전에 확장하는 패턴인데 이 패턴은 싱글톤 객체가 특정 타입의 인스턴스지만 프로퍼티나 매서드를 추가하여 확장해야 할 때 유용하다.


    7.5 요약

    - 함수 표현식은 자바스크립트 프로그래밍에서 유용한 도구인데 함수 표현식은 함수에 꼭 이름이 필요하지 않게 함으로써 진정 동적인 프로그래밍을 가능하게 한다.

    - 익명 함수를 람다 함수라고도 부르는데 자바스크립트 함수를 사용하는 강력한 방법이다.

    - 함수 표현식은 함수 선언과 다르다. 함수 선언에는 이름이 필요하지만 함수 표현식에서는 필요하지 않다. 이름 없는 함수 표현식을 익명 함수라 부른다.

    - 함수를 참조하는 방법으로 명확히 정의된 것이 없어서 재귀함수는 더욱 복잡해졌다.

    - 스트릭트 모드가 아닐 때는 재귀 함수에서 함수 이름 대신 arguments.callee를 써서 자기 자신을 호출 가능하다.

    - 클로저는 다른 함수 안에서 정의된 함수인테 클로저는 외부에서 함수의 변수에 접근이 가능하다.

    - 클로저의 스코프 체인에는 자기 자신과 외부 함수, 전역 컨텍스트의 변수 객체가 담긴다.

    - 일반적으로 함수가 실행을 마치면 함수의 스코프 및 그에 담긴 변수 전체가 파괴된다.

    - 함수가 클로저를 반환했다면 해당 함수의 스코프는 클로저가 존재하는 동안에는 메모리에 계속 존재

    - 클로저를 사용하면 자바스크립트 자체에서는 지원하지 않는 블록 스코프를 다른 방법으로 흉내내는것이 가능하다.

    - 함수를 생성하는 즉시 호출하면 내부의 코드를 실행하지만 그에 대한 참조는 남지 않는다.

    - 결과적으로 함수에서 사용한 변수는 모두 파괴되는데 외부 스코프의 특정 변수로 설정된 변수는 예외

    - 자바스크립트에 고유 객체 프로퍼티라는 정식 개념은 없지만 클로저를 쓰면 외부 스코프에 정의된 변수에 접근 가능한 공용 메서드를 구현 가능하다.

    - 고유 변수에 접근 가능한 메서드를 특구너 메서드라 명칭한다.

    - 특권 메서드를 커스텀 타입에서 구현하려면 생성자나 프로토타입 패턴을 이용하고 싱글톤에서 구현하려면 모듈이나 모듈 확장 패턴을 이용한다.

    - 함수 표현식과 클로저는 자바스크립트에서 강력한 기능 중 하나이며 많은 일을 할수 있지만 클로저는 스코프를 더 관리해야 하므로 과용하면 메모리 소비가 늘어날 수 있다.


    요약 후기

    지금 자바스크립트 입문책과 함께 노란책을 같이 병행중인데 입문책을 본 이후에 노란책을 다시 보니 훨씬 이해하기가 한결 수월하다. 현재 시간이 많이 남는 만큼 자바스크립트를 6월달 안에 끝낼 생각이다. 이후에 Node.js나 HTML5, CSS3 부분을 다시 살펴볼 생각이다.

    반응형

    댓글

Designed by Tistory.