-
[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 부분을 다시 살펴볼 생각이다.
반응형'프로그래밍 > JavaScript' 카테고리의 다른 글
JavaScript ES6에서의 순회와 이터러블 프로토콜 (0) 2019.05.30 JavaScript ES6 함수형 자바스크립트 기본 (0) 2019.05.26 [JavaScript] 05-2. 참조타입 (0) 2014.05.27 [JavaScript] 05-1. 참조타입 (0) 2014.05.27 [JavaScript] 06-1. 객체 지향 프로그래밍 - 객체에 대한 이해 (0) 2014.04.09