스코프는 변수에 접근할 수 있는 범위를 뜻하며
식별자가 유효한 범위 , 식별자를 검색할 때 사용하는 규칙이라고도 할 수 있다.
모든 식별자는 자신이 선언된 위치에 의해 다른코드가 식별자 자신을 참조할 수 있는
유효 범위가 결정되기 때문이다.
스코프가 없다면 같은 이름을 갖는 변수들이 충돌을 일으키므로 프로그램 전체에서 중복되는 이름의 변수를 사용할 수 없게 된다.
식별자 결정은 이름이 같은 두개의 변수 중 어떤 변수를 참조할 것인지를 말한다.
자바스크립트 엔진은 스코프를 통해 어떤 변수를 참조할 지를 결정한다.
함수 내부에서 함수가 정의되는 것을 함수의 중첩 이라 하는데
스코프는 이러한 함수의 중첩에 의해 계층적 구조 를 가지게 되고
이 구조로 연결된 것을 스코프 체인 이라고 한다.
전역 스코프는 말그대로 어느 곳에서든지 해당 변수에 접근할 수 있다.
전역 스코프는 가장 바깥쪽에 있으며
전역 스코프에서 선언한 변수를 전역 변수
라고 한다.
지역 스코프는 해당 지역에서만 접근할 수 있어 지역을 벗어난 곳에서는 접근이 불가능하다.
지역 스코프는 전역 스코프 외 다른 스코프들을 말하며
지역 스코프에서 선언한 변수를 지역 변수
라고 한다.
지역변수는 전역변수보다 더 높은 우선순위를 가진다.
블록 스코프는 블록 {}
이 생성될 때마다 새로운 스코프가 형성되는 것을 의미한다.
원래 자바스크립트는 함수 스코프를 따르지만, let
과 const
키워드의 등장으로
블록 스코프를 형성하는 것도 가능해졌다.
함수스코프는 function 키워드가 등장하는 함수 선언식과 함수 표현식을 의미한다.
함수에서 선언한 변수들은 해당 함수 내에서만 접근할 수 있는 특징이 있다.
var 키워드는 블록 스코프를 무시하고 함수 스코프만 따른다.
(예외로 화살표 함수의 블록 스코프는 무시하지않는다.)
let 키워드는 재선언을 방지한다
(var 키워드는 재선언을 해도 에러가 안나는 이유로 let 키워드가 더 안전하다.)
변하지 않는 값(상수)을 정의할 때 사용한다.
const는 재할당이 불가능하며, 값을 재할당할 경우 TypeError를 내므로,
의도치 않은 값의 변경을 막을 수 있다.
값의 변경을 최소화해 보다 안전한 프로그램을 만들 수 있다.
👨🏫 var let const 요약
var let const 유효범위 함수 스코프 블록 스코프 블록 스코프 값 재할당 가능 가능 불가능 재선언 가능 불가능 불가능
호이스팅이란 함수 안에 있는 선언을 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 의미한다.
console.log("Hello, World");
var varVariable = "one";
let letVariable = "two";
위의 코드는 아래와 같이 해석할 수 있다.
var varVariable;
console.log("Hello, World");
varVariable = "one";
let letVariable = "two";
알 수 있는 것은
var로 선언한 변수의 경우 호이스팅이 발생해 최상위로 변수 선언이 옮겨졌지만
let의 경우 호이스팅이 발생하지 않았다.
var로 코드를 작성하는 경우 호이스팅이 발생해 같은 이름의 변수나 함수로 값이 변질될 수 있다.
호이스팅이 자주 일어나는 코드는 유지보수가 어려워지고 쓸모없는 코드가 생길 수 있다.
스코프로 시작해 호이스팅까지만 알아보게되었다.
더 깊게 가다간 글이 끝나지 않을 것 같아 호이스팅에 세부적인 내용은 따로 정리해봐야겠다.