소년코딩

자바스크립트에서는 오직 함수많이 유효 범위의 한 단위다.

그래서 블록 레벨 스코프라는 개념이 없다.

블록 문장에서 정의한 변수는 해당 문장이 아니라 외부 함수에 묶인다.

function outNumbers(count) {
     for (var i = 0; i < count; i++) {
          console.log(i);
     }
 
     console.log(i)   
}

위 함수는 for 루프를 정의하고 변수 i를 0으로 초기화 시킨다.

자바나 C++ 같은 언어에서는 변수 i가 for 루프 블록 내부에 존재하므로 루프가 실행을 마치면 변수는 곧 파괴된다.

하지만 자바스크립트에서는 변수 i가 outNumbers() 컨텍스트의 활성 객체 일부인 것으로 정의되므로 그 시점부터는 함수 내에서 접근할 수 있다.


블록 스코프 흉내내기

익명 함수를 사용한 즉시 실행 함수블록 스코프를 흉내 낼 수 있다.

// 블록 스코프 흉내내기
(function() {
     // 코드 블록
})();

 

function outNumbers(count) {
     (function () {     
          for (var i = 0; i < count; i++) {
               console.log(i);
          }
     })();
 
     console.log(i)   // error (i is not defined...)
}

익명 함수 안에서 정의한 변수는 익명 함수가 실행을 마치는 즉시 파괴되므로 변수 i도 루프 안에서 사용한 후 파괴된다.

익명 함수는 클로저여서 외부 스코프의 변수에 자유로이 접근할 수 있으므로 count 변수 역시 익명 함수 안에서 접근이 가능하다.

 

이런 패턴은 전역 스코프에 추가되는 변수나 함수의 수를 제한하는 용도로 자주 사용한다.

 

일반적으로 전역 스코프에 변수나 함수를 추가하지 않는 편이 좋으며 여러 개발자들이 협업을 할 때 이를 꼭 지켜야 충돌을 막을 수 있다.

또한 익명 함수에 대한 참조가 존재하지 않으므로 클로저의 메모리 문제도 덜한다.

참조가 존재하지 않으므로 함수 실행을 마치는 즉시 스코프 체인을 파괴하여 메모리를 회수할 수 있기 때문이다.


 

자바스크립트

by 소년코딩

추천은 글쓴이에게 큰 도움이 됩니다.

악플보다 무서운 무플, 댓글은 블로그 운영에 큰 힘이됩니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기