자바스크립트 함수의 유효 범위 (Scope of Functions)

자바스크립트에서 함수는 변수와 마찬가지로 유효 범위(scope)를 가지고 있습니다. 이는 함수 내부에서 선언한 변수들이 해당 함수 내에서만 접근 가능하다는 것을 의미합니다. 자바스크립트에서는 전역 범위와 지역 범위의 두 가지 유효 범위를 지원합니다.

전역 범위 (Global Scope)

전역 범위는 프로그램 전체에 적용되는 범위로, 어디에서든 접근할 수 있는 변수를 의미합니다. 전역 범위에서 선언된 변수는 모든 함수 내에서 사용할 수 있습니다. 하지만 전역 변수는 너무 많아지면 코드의 가독성을 낮출 수 있으며, 예기치 않은 문제를 발생시킬 수도 있습니다.

// 전역 범위 변수
var globalVariable = "This is a global variable";

function exampleFunction() {
   console.log(globalVariable); // "This is a global variable"
}

exampleFunction();

지역 범위 (Local Scope)

지역 범위는 함수 내부에서 선언된 변수들의 범위로, 해당 함수 내에서만 접근 가능합니다. 여러 함수에서 같은 이름의 지역 변수를 선언할 수 있으며, 각 함수 내에서만 유효합니다. 이를 통해 변수의 충돌을 방지하고, 함수별로 독립적인 값을 유지할 수 있습니다.

function exampleFunction() {
   // 지역 범위 변수
   var localVariable = "This is a local variable";
   
   console.log(localVariable); // "This is a local variable"
}

exampleFunction();
console.log(localVariable); // ReferenceError: localVariable is not defined

##함수 유효 범위 (Function Scope)

자바스크립트에서 함수는 다른 함수 내에서 정의될 수 있습니다. 이 때, 내부 함수는 외부 함수의 변수에 접근할 수 있는데, 이를 함수 유효 범위 (function scope)라고 합니다.

function outerFunction() {
   var outerVariable = "This is an outer variable";
   
   function innerFunction() {
      console.log(outerVariable); // "This is an outer variable"
   }
   
   innerFunction();
}

outerFunction();
console.log(outerVariable); // ReferenceError: outerVariable is not defined

앞의 예제에서 innerFunctionouterFunction의 변수 outerVariable에 접근할 수 있습니다. 하지만 외부에서는 outerVariable에 접근할 수 없으므로, 마지막 console.log는 에러를 발생시킵니다.

블록 범위 (Block Scope)

ES6 이후의 자바스크립트에서는 블록 범위인 letconst를 지원합니다. letconst로 선언된 변수는 해당 블록 내에서만 유효하며, 블록 외부에서 접근할 수 없습니다.

function exampleFunction() {
   if (true) {
      let blockVariable = "This is a block scoped variable";
      console.log(blockVariable); // "This is a block scoped variable"
   }

   console.log(blockVariable); // ReferenceError: blockVariable is not defined
}

exampleFunction();

블록 범위 변수인 blockVariableif문 블록 내에서만 유효하며, 블록 외부에서는 접근할 수 없습니다.

결론

자바스크립트 함수의 유효 범위는 변수가 해당 함수 내에서만 접근 가능하다는 것을 의미합니다. 전역 범위, 지역 범위, 함수 유효 범위, 그리고 블록 범위 등 다양한 유효 범위를 통해 변수의 범위를 제어할 수 있습니다. 이를 적절히 활용하여 코드의 가독성과 유지 보수성을 높일 수 있습니다.