본문 바로가기

Javascript

javascript 익명 함수 정리

1. 익명 함수란?

 

더보기
익명 함수는 람다 대수로부터 영향을 받아 만들어진 프로그래밍에서 함수를 표현하는 방식의 일종이다. 비교적 최근부터 대부분의 프로그래밍 언어가 익명 함수를 지원한다. 흔히 Java가 8버전 부터 람다를 지원하게 되었다고 하는데 이때 람다가 익명 함수(Lambda abstraction) 를 말한다.

 

각 언어별로 익명 함수를 표현하는 법은 제각기 다르지만, 공통적으로 가지는 특징이 있다. 바로 일급 객체(First-class citizen) 라는 점이다.

 

일급 객체는 함수의 인자로 넘겨받을 수도 있으며, 함수의 결과값으로 리턴할 수도 있고, 변수에 값을 할당할 수도 있다는 것을 말한다. 프로그래밍 언어에서 익명 함수는 애초에 다른 함수에 인자로 넘기거나 함수의 결과 값으로 리턴할 용도(이를테면 map()에 인자로 넘긴다던지, 클로저를 리턴한다던지)로 만들어지기 때문에 이런 특징을 갖게 되는 것이다. 또한 함수가 일급 객체가 되면 일급 함수(First-class function) 라고 부를 수 있다.

 

나는 익명함수이면서 일급함수라면 람다라고 부를 수 있다고 생각한다. 어떤 분은 람다는 순수함수여야 한다는 생각을 가지고 있기도 하지만, 이것은 위에서 다룬 수학적 의미의 람다에 가까운 것으로 프로그래밍 언어에서의 람다와는 거리가 있다는 게 내 생각이다. 물론 함수형 프로그래밍 패러다임에서는 순수함수여야겠지만 함수형 프로그래밍 패러다임에서는 람다가 아니라 모든 함수가 순수함수여야 한다.

 

아까 전에 각 언어별로 익명 함수를 표현하는 법이 제각기 다르다고 했는데, 그 차이가 가장 두드러지는 언어가 파이썬이다. 파이썬의 익명함수는 문맥(Statement) 이 아닌 표현식(Expression) 만을 지원한다.

 

즉, 파이썬의 익명함수는 블록을 가지지도 않고, 리턴하는 값만 표현하는 식 하나로만 구성된 다는 것이다. Quora의 어떤 질문의 답변에서 파이썬은 람다 함수(Lambda function)가 아니라 람다 표현식(Lambda expression)을 지원하는 것이라고 하는데 아주 적절한 표현이라고 생각한다.

 

 

 

출처: https://hyunseob.github.io/2016/09/17/lambda-anonymous-function-closure/

 

 

익명 함수는 한번만 사용할 함수를 위한 개념 (재사용X)으로 함수의 이름을 따로 갖지 않음.

// 익명함수
function() {
   // logic
}

// 일반함수
function funcName() {
   // logic
}

다음과 같은 형태를 가지고 있음. 함수의 이름 존재 X

 

 

익명함수는 리터럴(Literal) 방식으로 변수에 담겨 사용하는 함수

// 리터럴 방식 (변수에 데이터를 넣을 때 사용하는 방식)
let a = 20;
const b = 30;


// 익명 함수 hey 변수에 저장
const hey = function() {
  console.log('hey');
} 

// 출력: hey
hey();

 

 

 

 

2. 일반 함수와 익명 함수의 차이 => 호이스팅 

 

  익명 함수 일반 함수
호이스팅 X O

 

일반함수의 경우 함수 전체가 전부 맨 위로 올라가므로 함수를 호출하는 위치에 상관없이 사용될 수 있고,

익명함수의 경우는 리터럴 방식으로 사용하기때문에 변수가 호출되었을 때 실행되고, 그래서 선언부가 호출 위치보다 위에 있어야 함.

 

// 일반함수

handleFunction();

function handleFunction() {
   console.log('일반함수 나와!');
}

// 출력: 일반함수 나와!

 

// 익명함수

handleFunction();

const handleFunction = function() {
  console.log('익명함수 나와!');
}

// 출력 안됨 ERROR


-----------------------------------------------------------------------------------------------

const handleFunction = function() {
  console.log('익명함수 나와!');
}

handleFunction();

// 출력: 익명함수 나와!

=> 일반 함수는 전역적이며 전체가 호이스팅 되므로 호출의 위치와 선언의 위치 간에 연관관계가 없고 재사용이 가능

     익명 함수는 선언부만 호이스팅되며 호출의 위치와 구현의 위치간에 순서가 맞아야 하고, 한번만 사용 가능

 

 

 

 

3. 익명함수의 장점

 

메모리 관리에 효과적


  • 일반 함수는 자바스크립트를 초기에 읽어올 때 모두 호이스팅되므로, 전체 자바스크립트 내에서 단 한번만 사용되는 함수가 일반 함수로 구현되어 있다고 하면 사용될 한번을 기다리며 불필요하게 메모리를 차지하고 있어야 함 

  • 메모리 사용량이 성능에 중요한 영향을 미칠 수 있는 웹에서 메모리 낭비

=> 단 한번만 사용되는 함수를 익명함수로 구현한다면 해당 함수가 필요한 위치에서만 함수가 구현되고 사라지면서 메모리를 아낄 수 있게 됨