뜬금없지만 함수는 1급 객체입니다. 자기 자신을 호출하거나 다른 함수의 매개변수가 되기도 하고 다른 함수를 반환할 수도 있습니다. 느낌표로 시작하는 함수문은 자기 호출함수의 형태중 하나입니다. 이 외에 두가지 형태의 자기 실행 함수가 있죠.


! 자기호출 익명함수(Self-invoking anonymous function)이란...


익명함수는 말그대로 함수의 이름이 없는 함수를 말합니다. 자바스크립트는 이름이 없는 함수인 익명형수 형태로 사용이 가능하며 대부분 다른 함수의 매개변수로 사용됩니다. (참고로, 모든 함수는 일단 호출이 되면 어떤 것이든 반환합니다. 그게 undefined라도 말이죠...)
다음에서 익명함수를 살펴보면...


function () {
...
}

이런식으로 생겨 있습니다. 자기호출 익명함수는 말그대로 자기 스스로를 호출한다는 의미입니다. 위의 익명함수는 위와 같은 형태로 사용될 수는 없지만 다른 함수의 매개변수로 쓰일 경우에는 정상 동작합니다. 하지만 자기호출 익명함수일 경우는 스스로 동작하는데 아래와 같은 방식이 있습니다. 그중 하나가 바로 !(느낌표)를 사용한 방법입니다.

# 느낌표 !를 사용한 자기호출 익명함수



!function () {
...
}()


간단하게 설명하면 앞에 느낌표를 통해 함수는 호출되면서 바로 실행됩니다. 그리고 뒤에 ()를 이용해 함수에 이용될 매개변수를 받습니다. 예를 들어 'Hello'라는 메세지를 출력하는 익명함수라면 다음과 같습니다.


!function (msg) {
alert(msg);
}('Hello')

여기서 눈여겨볼점은 자기스스로 호출이 가능하다는 점과 함수뒤에 () 소괄호를 이용해 매개변수를 받을 수 있다는 점입니다.

그리고, 느낌표를 사용하면 불리언값을 호출하며 반환되는 return값의 반대값을 호출합니다. 위 코드를 실행하면 return이 없으므로 false를 반환하나 ! 연산자 때문에 true를 반환하게 됩니다. 아래는 또 다른 자기호출 방식의 익명함수 방식입니다.

# 소괄호를 사용한 자기호출 익명함수


소괄호를 사용해 호출할 수 있으며 아래처럼 두가지 타입 모두 가능합니다.


// 1번 타입
(function (msg) {
...
})('Hello')



// 2번 타입
(function (msg) {
...
}('Hello'))



지금까지 간단하게 자기호출 익명함수의 사용방법에 대하여 알아봤습니다. 익명함수는 함수의 리턴되는 값을 수정하여 반환하는 경우에 많이 사용되고 또는 클로저를 우회하는 방법으로도 많이 사용됩니다.