[JS] 14_01강 유효범위

정수연·2022년 3월 24일
0

전역변수 vs 지역변수

유효범위란? '변수의 수명'을 의미

지역변수
함수 내에서 변수를 선언한 경우 (local)
전역변수
함수 밖에서 변수를 선언한 경우
즉, 애플리케이션 전역에서 접근이 가능한 변수이다. (global)

// 지역변수 vs 전역변수
// Ex01
var vscope = 'global';
function fscope(){
    var vscope = 'local'
    alert(vscope); // local 출력, 가까운 곳에서 선언한 변수 출력
}
fscope();

// Ex02
var vscope = 'global';
function fscope(){
    var vscope = 'local';
    var lv = 'local variables';
    alert(lv); // local variables
}
fscope();
alert(lv); // Undefined, 지역변수이기 때문에 함수 내에서만 호출 가능함

// Ex03
var vscope = 'global';
function fscope(){
  // 1) var 사용O
    var vscope = 'local';
  // 2) var 사용X
 // vsscope = 'local'; -- 전역변수
}
fscope(); 
alert(vscope); // 1) global 2) local
// **var을 사용하지 않는 지역변수는 전역변수가 된다.

// Ex04
var vscope = 'global';
function fscope(){
// 지역변수 선언 후, 전역변수 선언했을 경우  
    var vscope = 'local';
    vsscope = 'local'; // 우선적으로 지역변수로 지정되었기 때문에, 해당라인에서 vsscope은 지역변수의 값을 할당하게 된다.
}
fscope(); 
alert(vscope); // global

cf. 전역변수는 사용하지 않는 것을 권장한다.
→ 여러가지 이유로 그 값이 변경될 수 있기 때문!


유효범위의 효용

// Ex01 
// Ex01과 Ex02의 차이점을 이해해보자.
function a (){
    var i = 0; // *지역변수
}
for(var i = 0; i < 5; i++){
    a();
    document.write(i); // 01234
}

// Ex02
// 만약 함수a 내부의 지역변수를 선언할 때, var을 사용하지 않았다면? (아래 예제)
function a (){
    i = 0; // *전역변수
}
for(var i = 0; i < 5; i++){
    a();
    document.write(i); // 무한루프 발생
// 전역변수는 각기 다른 로직에서 사용하는 같은 이름의 변수값을 변경시켜서 의도하지 않은 문제를 발생시킨다.
}

전역변수의 사용

불가피하게 전역변수를 사용해야 하는 경우에는
1) 하나의 객체를 전역변수로 만들고 객체의 속성으로 변수를 관리하는 방법을 사용하거나,
2) 전역변수를 사용하고 싶지 않다면 아래와 같이 익명함수를 호출한다.

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());
}())

JS에서의 유효범위의 대상

JS : 함수에 대한 유효범위를 제공
(=자바스크립트의 지역변수는 함수에서만 유효하다.)

// JavaScript
for(var i = 0; i < 1; i++){
    var name = 'coding everybody'; // 전역변수
}
alert(name); // coding everybody
// 즉, 자바스크립트의 지역변수는 함수에서만 유효하다.
// Java
for(int i = 0; i < 10; i++){
    String name = "sooyeon"; // for문에 대한 지역변수, for문의 중괄호{..}내에서만 유효
}
System.out.println(name); // error, 여기서 name은 존재하지 않는 변수이기 때문에

정적 유효범위

JS : 함수가 선언된 시점에서의 유효범위를 갖는다.
이러한 유효범위의 방식을 정적 유효범위(static scoping), 혹은 렉시컬(lexical scoping)이라고 한다.

var i = 5;

function a(){
    var i = 10;
    b();
} 
function b(){
    document.write(i); // 5, 함수가 정의된 시점에서의 유효범위를 가짐
}
 
a(); 

📌 핵심포인트
- 전역변수 vs 지역변수 차이점 알 것
- var을 사용하지 않는 지역변수는 전역변수가 된다.
(전역변수는 각기 다른 로직에서 사용하는 같은 이름의 변수값을 변경시켜서 의도하지 않은 문제가 발생됨)

0개의 댓글