(자바스크립트) 함수는 언제 정의되는가?

var migrating=true;
if(migration){
  quack(4);
  fly(4);
}

var fly=function(num){
   for(var i=0; i<num; i++){
      console.log("훨훨~");
   }
};

function quack(num){
   for(var i=0; i < num ; i++){
       console.log("꽥");
   }
}

설명: quack함수는 실행되지만 fly는 실행되지 않는다.
그 이유는 함수 선언은 코드의 꼭대기, 바닥, 중간, 어디에나 놓고 어디에서나 호출할 수 있다. 함수 선언은 코드 어디에서 정의되어 있든 함수를 생성한다. 이것을 호이스팅(Hoisting)라고 한다.

하지만 함수 표현식은 평가되기 전까지는 함수가 정의되지 않으므로 분명히다르다. 따라서 위에서 구현한 것처럼 함수 표현식을 전역 변수에 할당하더라도 함수표현식이 실행되기 전까지는 호출할 수 없다.

위 예제코드에서는 두 함수가 모두 전역범위에 있다. 즉, 일단 정의만 되면 코드 어디에서든 볼 수 있다는 것이다. 그렇지만 내포된 함수(Nested Function)도 고려해야 한다. 내포된 함수는 다른 함수 안에 정의된 함수를 말한다. 내포된 함수는 호출할 수 있는 범위가 제한되어 있다.


댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기