스코프(Scope)
- 식별자 접근 규칙에 따른 유효 범위를 말함.
- 식별자(변수, 함수, 클래스)에 접근할 수 있는 범위가 존재한다.
- 범위는 중괄호(블록) 또는 함수에 의해 나눠진다.
- 각각 Block Scope, Function Scope라고 불린다.
function scopeExample(){
//Function Scope
var local = 'Seoul';
console.log(local);
{
//Block Scope
let name = 'Jook';
console.log(`${name} lives in ${local}`);
}
}
스코프 주요 규칙
1. 안쪽 스코프에서 바깥쪽 스코프로 접근할 수 있지만, 반대는 불가하다.
- 바깥쪽 스코프에서 선언한 식별자는 안쪽 스코프에서 사용가능.
- 안쪽 스코프에서 선언한 식별자는 바깥쪽 스코프에서 사용불가능.
let global_var = "Global";
{
let local_var = "Local";
console.log(`${global_var} can be seen in here`);//바깥쪽 Scope변수 참고가능.
}
console.log(local_var);//안쪽 Scope변수는 ReferenceError발생.
let global_var = "Global";
{
var local_var = "Local";//var 키워드로 변수 선언시 블록 외부에서도 접근가능(function block은 예외)
//Hoisting 참고
console.log(`${global_var} can be seen in here`);//바깥쪽 Scope변수 참고가능.
}
console.log(local_var);//Local 출력.
2. 스코프는 중첩이 가능하다.
- 스코프는 마치 중첩된 울타리와도 같다.
3. 전역 스코프와 지역 스코프.
- 바깥쪽 스코프를 전역 스코프(Global Scope)라고 한다.
- 그외는 지역 스코프(Local Scope)라고 한다.
4. 지역 변수는 전역 변수보다 우선순위가 더 높다.
- 전역 스코프에서 선언한 변수는 전역변수.
- 지역 스코프에서 선언한 변수는 지역변수.
- 지역 변수는 전역 변수보다 더 높은 우선순위를 가진다.
{
let variable = "외부";
{
let variable = "내부";
console.log(variable);//내부
}
console.log(variable);//내부
}
스코프의 종류
- 블록 스코프와 함수 스코프가 있음.
- 화살표 함수는 함수 스코프가 아니다. 블록 스코프로 취급한다.
스코프와 var, let, const 키워드
- 변수 선언 키워드 세가지의 차이점과 scope 유효 범위를 알아보자.
keyword | const | let | var |
global scope | N | N | Y |
function scope | Y | Y | Y |
block scope | Y | Y | N |
재할당 가능 여부 | N | Y | Y |
- 블록 스코프 안에서 let과 const키워드로 선언한 변수는 해당 스코프 안에서만 참조 가능.
- var 의 경우 블록 스코프를 무시하고 스코프 울타리 밖에서도 접근 가능하다.
- var는 Only 함수 스코프만 따른다.
=> 예측가능한 코드를 위해 let,const 사용 권장!
주의점
- window 전역 객체는 오직 브라우저에만 존재하는 객체이다.
- 브라우저의 창(window)를 의미하는 객체이다.
- 별개로 전역 영역을 담고 있음.
- 함수 선언식으로 함수를 선언하거나 var 키워드로 변수를 선언하면 window객체에 속해진다.
//web browser에서 실행된다고 가정!
var a = 'a';
let b = 'b';
window.a; /* "a" */
window.b; /* undefined */
- 전역 변수는 최소화 하라.
- 전역 변수는 어디서든 접근이 가능하므로 예상치못한 side effect가 생길 수 있다.
- 전역 변수를 var로 선언해서 브라우저의 내장기능을 못하게 만들 수 있음.
- 선언 없는 변수 할당 금지.
- 선언 없이 변수를 할당할 경우 해당 변수는 var로 선언한 전역 변수 처럼 취금.
- 실수 방지를 위해 Strict mode 사용가능.
- js파일 상단에 'use strict' 입력.
- StrictMode는 브라우저가 보다 엄격하게 동작하도록 만들어줌.
- "선언 없는 변수 할당"의 경우도 에러로 판단해준다.
'Language > Javascript' 카테고리의 다른 글
[Javascript] Promise의 기본 (1) | 2022.10.04 |
---|---|
[Javascript] ES6 Array helper (0) | 2021.11.19 |
[Javascript] 싱글스레드 기반 이벤트 루프와 비동기 (0) | 2021.11.18 |
[Javascript] Hoisting이란? (0) | 2021.11.11 |
[Javascript] ES6 문법 정리 (0) | 2021.11.10 |