📌
Javascript 생활코딩
  • 자바스크립트
  • 자바스크립트 기본
    • 숫자와 문자
    • 변수
    • 주석, 줄바꿈과 여백
    • 조건문 - 기본
    • 조건문 - 비교연산자
    • 조건문 - 논리연산자
    • 조건문 - boolean의 대체재
    • 반복문 - 기본 (while,for)
    • 반복문 - 제어(break, continue)
    • 반복문 - 중첩
    • 함수
    • 배열 - 기본
    • 배열 - 조작, 제거 및 정렬 메서드
    • 객체 - 기본
    • 객체 - 반복문
    • 모듈
    • UI와 API 그리고 문서보는 법
    • 정규표현식
  • 함수지향
    • 유효범위
    • 값으로서의 함수와 콜백
    • 클로저
    • arguments
    • 함수의 호출
  • 객체지향
    • 객체지향 프로그래밍
    • 생성자와 new
    • 전역객체
    • this
    • 상속
    • prototype
    • 표준 내장 객체의 확장
    • Object
    • 데이터 타입
    • 참조
  • 패턴
    • 재귀함수
Powered by GitBook
On this page
  • 유효범위
  • 유효범위의 효용
  • 전역변수의 사용
  • 유효범위의 대상 (함수)
  • 정적 유효범위

Was this helpful?

  1. 함수지향

유효범위

유효범위(Scope)는 변수의 범위를 의미합니다.

Previous함수지향Next값으로서의 함수와 콜백

Last updated 4 years ago

Was this helpful?

유효범위

var vscope = 'global';
function fscope(){
    alert(vscope);
}
fscope();
//global

함수 밖에서 변수를 선언하면 그 변수는 전역변수가 됩니다. 전역변수는 에플리케이션 전역에서 접근이 가능한 변수입니다. 다시 말해서 어떤 함수 안에서도 그 변수에 접근 할 수 있습니다. 그렇기 때문에 함수 fscope 내에서 vscope를 호출 했을 때 함수 밖에서 선언된 vscope의 값 global이 반환된 것 입니다.

var vscope = 'global';
function fscope(){
    var vscope = 'local';
    alert('함수안 '+vscope);
}
fscope();
alert('함수밖 '+vscope);
//'함수안 local','함수밖 global'

즉 함수 안에서 변수 vscope을 조회(4행) 했을 때 함수 내에서 선언한 지역변수 vscope(3행)의 값인 local이 사용되었습니다. 하지만 함수 밖에서 vscope를 호출(7행) 했을 때는 전역변수 vscope(1행)의 값인 global이 사용된 것입니다.. 즉 지역변수의 유효범위는 함수 안이고, 전역변수의 유효범위는 에플리케이션 전역인데, 같은 이름의 지역변수와 전역변수가 동시에 정의되어 있다면 지역변수가 우선한다는 것을 알 수 있습니다. 아래 예제 결과는 모두 local입니다.

var vscope = 'global';
function fscope(){
    vscope = 'local';
    alert('함수안'+vscope);
}
fscope();
alert('함수밖'+vscope);

함수밖에서도 vscope의 값이 local인 이유는 무엇일까? 그것은 함수 fscope의 지역변수를 선언할 때 var를 사용하지 않았기 때문입니다. var를 사용하지 않은 지역변수는 전역변수가 됩니다. 따라서 3행은 전역변수의 값을 local로 변경하게 된 것입니다. var을 쓰는 것과 쓰지 않는 것의 차이를 이해해야 합니다.

유효범위의 효용

아래 두개의 예제는 변수 i를 지역변수로 사용했을 때와 전역변수로 사용했을 때의 차이점을 보여줍니다. 전역변수는 각기 다른 로직에서 사용하는 같은 이름의 변수값을 변경시켜서 의도하지 않은 문제를 발생시킵니다.

지역변수의 사용

function a (){
    var i = 0;
}
for(var i = 0; i < 5; i++){
    a();
    document.write(i);
}
//01234

전역변수의 사용

본 예제는 무한반복을 발생시킵니다.

function a (){
    i = 0;
}
for(i = 0; i < 5; i++){
    a();
    document.write(i);
}

전역변수의 사용

불가피하게 전역변수를 사용해야 하는 경우는 하나의 객체를 전역변수로 만들고 객체의 속성으로 변수를 관리하는 방법을 사용합니다.

MYAPP = {}
MYAPP.calculator = {
    'left' : null,
    'right' : null
}
MYAPP.coordinate = {
    'left' : null,
    'right' : null
}
 
MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;
function sum(){
    return MYAPP.calculator.left + MYAPP.calculator.right;
}
document.write(sum());

전역변수를 사용하고 싶지 않다면 아래와 같이 익명함수를 호출함으로서 이러한 목적을 달성할 수 있습니다.

(function(){
    var MYAPP = {}
    MYAPP.calculator = {
        'left' : null,
        'right' : null
    }
    MYAPP.coordinate = {
        'left' : null,
        'right' : null
    }
    MYAPP.calculator.left = 10;
    MYAPP.calculator.right = 20;
    function sum(){
        return MYAPP.calculator.left + MYAPP.calculator.right;
    }
    document.write(sum());
}())

위와 같은 방법은 자바스크립트에서 로직을 모듈화하는 일반적인 방법입니다.

유효범위의 대상 (함수)

자바스크립트는 함수에 대한 유효범위만을 제공합니다. 많은 언어들이 블록(대체로 {,})에 대한 유효범위를 제공하는 것과 다른 점입니다.

for(var i = 0; i < 1; i++){
    var name = 'coding everybody';
}
alert(name);
//coding everybody

자바에서는 아래의 코드는 허용되지 않습니다. name은 지역변수로 for 문 안에서 선언 되었는데 이를 for문 밖에서 호출하고 있기 때문입니다.

for(int i = 0; i < 10; i++){
    String name = "egoing";
}
System.out.println(name);

자바스크립트의 지역변수는 함수에서만 유효하다.

정적 유효범위

자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖습니다. 이러한 유효범위의 방식을 정적 유효범위(static scoping), 혹은 렉시컬(lexical scoping)이라고 합니다.

var i = 5;
 
function a(){
    var i = 10;
    b();
}
 
function b(){
    document.write(i);
}
a();
//5