즉시 실행 함수
함수 정의와 동시에 즉시 호출되는 함수를 즉시 실행 함수라고 한다.
즉시 실행 함수는 단 한 번만 호출되며 다시 호출할 수 없다.
// 익명 즉시 실행 함수
(function ( ){
var a = 3;
var b = 5;
return a * b;
}());
즉시 실행 함수는 함수 이름이 없는 익명 함수를 사용하는 것이 일반적.
함수 이름이 있는 기명 즉시 실행 함수도 사용할 수 있다.
// 기명 즉시 실행 함수
(function foo(){
var a = 3;
var b = 5;
return a * b;
}());
foo(); // ReferenceError: foo is not defined
하지만 그룹 연산자 ( ... ) 내의 기명 함수는 함수 선언문이 아니라 함수 리터럴로 평가되며 함수 이름은 함수 몸체에서만 참조할 수 있는 식별자이므로 즉시 실행 함수를 다시 호출할 수는 없다.
즉시 실행 함수는 반드시 그룹 연산자 ( ... )로 감싸야 한다. 그렇지 않으면 에러가 발생한다.
function (){ // SyntaxError: Function statements require a function name
//...
}();
여기서 에러가 발생한 이유는 함수 정의가 함수 선언문의 형식에 맞지 않았기 때문이다.
함수 선언문은 함수 이름을 생략할 수 없다.
function foo(){
// ...
}(); // SyntaxError: Unexpected token ')'
다시 에러가 발생하는데 그 이유는 자바 스크립트 엔진이 암묵적으로 세미콜론 자동 삽입 기능에 의해 함수 선언문이 끝나는 위치, 즉 함수 코드 블록의 닫는 중괄호 뒤에 " ; " 이 암묵적으로 추가되기 때문.
function foo() {}(); // => function foo() {};();
함수 선언문 뒤의 (...)는 함수 호출 연산자가 아니라 그룹 연산자로 해석되고 그룹 연산자에 피연산자가 없기 때문에 에러가 발생하기 때문이다.
그렇기 때문에 즉시 실행 함수는 그룹 연산자로 감싸야 한다는 것이다.
즉 그룹 연산자로 함수를 묶은 이유는 먼저 함수 리터럴을 평가해서 함수 객체를 생성하기 위해서다.
// 즉시 실행 함수도 일반 함수처럼 값을 반환할 수 있다.
var res = (function (){
var a = 3;
var b = 5;
return a * b;
}());
console.log(res); // 15
// 즉시 실행 함수에도 일반 함수처럼 인수를 전달할 수 있다.
res = (function (a, b){
return a * b;
}(3, 5));
console.log(res); // 15
'JavaScript' 카테고리의 다른 글
javaScript-함수9 (중첩 함수) (0) | 2023.02.21 |
---|---|
javaScript-함수8 (재귀 함수) (0) | 2023.02.21 |
javaScript-함수6 (반환문) (0) | 2023.02.20 |
javaScript-함수5 (인수확인, 매개변수의 최대 개수) (0) | 2023.02.20 |
javaScript-함수4 (함수 호출) (0) | 2023.02.20 |