✨유효 범위(Scope)란?
자바스크립트에서 객체나 함수는 모두 변수(variable)입니다.
변수의 유효 범위(scope)란 해당 변수가 접근할 수 있는 변수, 객체 그리고 함수의 집합을 의미합니다.
🌟지역(local) 변수와 전역(global) 변수
하단의 코드를 통해 지역변수와 전역 변수를 비교해보자
let vscope = 'global'; // 전역변수
// 애플리케이션 전역에서 접근 할 수 있는 변수
function fscope(){
let vscope = 'local'; // 지역변수
//함수의 중괄호 내에서만 접근 할 수 있는 변수
console.log(vscope);
}
fscope();
//fscope 함수는 같은 함수 안에 있는 vscope를 출력하게된다.
🟣전역 변수(global)
let vscope = 'global';
function fscope(){
console.log(vscope);
}
function fscope2(){
console.log(vscope);
}
fscope();//출력 : global
fscope2();//출력: global
🟣지역변수(local)
let vscope = 'global';
function fscope(){
let vscope = 'local';
let lv = 'local variables';
console.log(vscope);
}
fscope();//출력 local
console.log(lv);//출력: undefined. 이유는 lv(지역변수)는 함수의 중괄호 내에서만 접근이 가능하다.
📢이때 중요한 점은 전역 변수와 지역변수 앞에 (let)을 선언해주는 것이다.
만약 함수 내의 변수에 var을 빼고, 변수만을 선언하면 전역 변수의 값을 가져올 것이다.
하단의 코드를 한번 보자
let vscope = 'global'; //전역에 변수를 생성해줌(전역변수)
function fscope(){
let vscope = 'local';//지역내에 변수를 생성해줌(지역변수)
console.log(vscope);
}
fscope();
📢변수를 선언할 때는 꼭 let을 붙이는 것을 습관화해야 한다.
전역 변수를 사용해야 하는 경우라면 그것을 사용하는 이유를 명확히 알고 있을 때 사용해야 한다.
그게 아니라면 지역변수를 이용해 프로그래밍을 작성하는 것이 좋다.(버그를 막고 로직의 재활용을 위함)
❗ 유효 범위의 필요성
이름의 충돌, loigic의 충돌을 막기 위함
function a(){
let i =0; //let을 제거하게된다면 i 값은 전역변수가된다.
}
for(let i = 0 ; i <5 ; i++){
a();
console.log(i);
}//함수 i의 값과 for문 안의 i값은 동일하기때문에 i는 계속 0으로 초기화된다. 때문에 프로그램은 멈추지 않고 계속 돌아갈 것이다.
상단 함수 안에 i 앞에 let이 제거된다면 for문 안의 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;
}
console.log(sum());
(하단) 제이쿼리에서 많이 사용하는 라이브러리 방식
//전역변수를 사용하고 싶지 않다면 하단과 같이 익명함수를 호출한다.
(function(){
let 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;
}
console.log(sum());//함수 선언을 통해 전역 변수가 아닌 지역변수로 변경된 것을 볼 수 있다.
}())
📢여기서 잠깐!📢
잠시 유효 범위의 대상(함수)을 알아보자
지역 범위를 선언할 수 있는 곳은 함수로 제한된다.(다른 언어와 차별된 점이다.)
JS에선 함수의 중괄호 내에서 선언된 변수만이 지역변수가 되는 것이다.
for문 while문 등에서 선언되는 변수는 지역변수가 되지 않는다.
❗ 정적 유효 범위란?
자바스크립트는 함수가 선언된 시점에서 유효 범위를 가진다.
이러한 유효 범위의 방식을 정적 유효 범위(static scoping), 혹은 렉시컬(lexicla scoping)이라고 한다.
let i =5;
function a(){
let i = 10;
b();
}
function b(){
console.log(i);//b함수내에 지역변수 i가 없기 때에 전역 변수를 찾아 사용한다.
}
a();
변수가 사용될 때가 아닌 변수가 정의될 때 고정적으로 전역 변수가 사용되게 된다.(정적 유효 범위)
출처: 드림코딩 엘리, 생활코딩, DeepDive
'Front-end > JavaScript' 카테고리의 다른 글
[JavaScript] arguments (0) | 2021.10.28 |
---|---|
[JavaScript] 값으로서의 함수와 콜백 (0) | 2021.10.28 |
[JavaScript ES6]객체(Object) (0) | 2021.10.22 |
[JavaScript ES6]배열(array) (0) | 2021.10.21 |
[JavaScript] 함수[재사용성,입력(input), 출력(output)] (0) | 2021.10.20 |