유효범위

Doyoon Lee·2020년 6월 27일
0

Javascript

목록 보기
4/23

전역변수와 지역변수

var vscope = "global"; // 전역변수

function fscope(){
    var vscope = 'local'; //지역변수
    alert(vscope);
}

function fscope2(){
    alert(vscope);
}

fscope(); // local 이 출력된다.
fscope2(); // global 이 출력된다.

전역변수 : 광범위하게(whole window) 적용되는 변수

지역변수 : 함수 안에 써 있는 변수. 지역적으로 그 함수 내에서만 적용되는 변수. (for, if 문 안에 써 있는 변수는 해당되지 않는다.)

  • 꼭 필요한 경우가 아니라면 지역변수만 사용하는 것이 안전하다.
  • var 을 사용해야 함수 바깥에 쓰면 전역변수, 함수 안에서 쓰면 지역변수가 된다.


전역변수와 지역변수 - 예시 1

var vscope = "global"; // 전역변수

function fscope(){
    var vscope = 'local'; //지역변수
}

alert(vscope);

예시의 코드는 global이 출력 된다. local은 지역변수이기 때문에 바깥에 있는 alert에 적용이 안돼기 때문이다.


전역변수와 지역변수 - 예시 2

var vscope = "global"; 

function fscope(){
    vscope = 'local'; 
    alert(vscope);
}

fscope();

위의 예시에서는 vscope이 지역변수가 아니라 전역변수를 재정의한것이다. local이 출력된다.


전역변수와 지역변수 - 예시 3

function a (){
    i = 0;
}

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

위의 코드를 실행하면 오류가 난다. for 구문 안에 있는 var i = 0 이 전역변수로 적용된다.




전역변수의 사용 - 전역변수에 속성 만들기

var MYAPP = {}
MYAPP.calculator = { // 전역변수.속성1
    'left' : null,
    'right' : null
}
MYAPP.coordinate = { // 전역변수.속성2
    '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());
}())

전체를 익명 function으로 감싼 익명함수를 만든다.


정적 유효범위 - static scoping(lexical scoping)

var i = 5;
 
function a(){
    var i = 10;
    b();
}
 
function b(){
    document.write(i);
}
 
a();
  • 위 예시에서 i는 5로 호출된다.
  • b 함수가 정의될 때의 i 값을 가져오지, 사용될 때의 i 값을 가져오는 것이 아니기 때문이다.

0개의 댓글