자바스크립트의 핵심매커니즘인 Scope를 알아본다.
코드가 정의되는 시점의 컨텍스트로, 변수가 저장되는 논리적인 공간이자 유효범위
Scope
는 범위
라는 사전적인 뜻을 갖고있는 단어다.
자바스크립트에서 Scope는 대표적으로변수의 유효범위
를 의미한다.
스코프의 종류에대해 정리해본다.
애플리케이션이 실행되는 즉시 만들어지는 공간이다.
모든곳에서 접근이 가능하다.
어디서 어떻게 수정되어 더렵혀질지 모르니 전역스코프에 값을 변수를 등록/저장하는 것을 지양하자.
const
키워드를 이용해서 값의 수정이 불가능하도록 만든다면 사용해도 상관은 없지만, 변수명의 중복이 일어날 수 있기때문에, 어찌됐든 지양하는게 좋다.
// 전역스코프 생성
var a = 0; // 전역스코프에 저장
특정영역을 갖는 스코프들이다.
함수에 의해서 생성되는 스코프로, 함수가 실행될 때 생성된다.
함수영역을 기준으로 한다.
function fn() {
var a = 2; // fn 함수스코프에 저장
}
fn2() // fn 함수스코프 생성
{}
안의 영역을 "블록"이라고 부르는데, 블록영역을 기준으로 하는 스코프다.
블록안의 코드가 실행될 때 생성이 된다.
블록안에서 let/const
키워드로 선언된 변수들이 블록스코프안에 생성된다.
ES6 문법을 지원하는 환경에서만 사용이 가능하다.
{
// 블록스코프 생성
let a = 10; // 블록스코프에 저장
const b = 20; // 블록스코프에 저장
var c = 30; // 전역스코프에 저장
}
스코프에는 몇가지 특징이 있다.
자바스크립트의 스코프는 정의되는 시점과 생성되는 시점이 다르다.
함수스코프는 함수가 선언될 때 정의된다.
함수스코프는 함수가 호출(실행)될 때 생성된다.
함수스코프는 코드의 실행이 끝났을 때 사라진다.
var x = 10
function fn1() {
var x = 20;
fn2();
}
function fn2() {
console.log(x);
}
fn1(); // 10
fn2
의 부모스코프는 f1
의 스코프일 것 같은데, 왜 전역스코프의 10이 찍히는 걸까?
이유는 fn2
의 스코프는 fn2
가 선언되는 시점에 정의되기 때문이다.
fn2
함수가 전역공간에 정의(선언)가 되어있기 때문에, 전역스코프가 부모스코프가 된다.
이렇게 선언과정에서 정의되는 스코프를 렉시컬 스코프
라고 부른다.
반대로 실행되면서 정의되는 스코프를 동적 스코프
라고 부른다.
스코프는 중첩이 가능하다. (스코프의 중첩)
자식스코프는 부모스코프에 접근이 가능하고, 그 역은 불가능하다.
참조하고자하는 변수가 자신의 스코프에 존재하지 않을때, 부모스코프로 올라가 변수의 값을 찾는다. (스코프 체이닝)
var a = 1;
function fn() {
var b = 2;
{
const c = 3;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
}
console.log(a) // 1
console.log(b) // 2
// console.log(c) // ReferenceError: c is not defined
}
fn();
console.log(a); // 1
// console.log(b); // ReferenceError: b is not defined
// console.log(c); // ReferenceError: c is not defined
https://developer.mozilla.org/ko/docs/Glossary/Scope
https://poiemaweb.com/js-scope