식별자가 참조될 수 있는 범위.. (게임으로 치면 사정거리?라고 생각하자!)
👉 전역 스코프 : 코드 상 모든 위치에서 접근이 허용된 식별자를 뜻함.
👉 지역 스코프 : 코드 상 제한된 위치에서 접근이 허용된 식별자를 뜻함.
👉 블록 스코프 : 함수를 포함한, if문, for, switch문 등에 있는 모든 블록안에서 지역변수로 작동하는 식별자를 의미한다. (let const)
👉 함수 스코프 : 저 많은 블록중에, 딱 함수안에서만 블록으로 작동하는 식별자를 의미한다.(var 키워드)
// 블록 스코프 
{
	let a = 10;
  	console.log(a); // 10
}
console.log(a); // a is not defined(블록 밖에서 접근 못 함)
{
	const number = 11;
  	console.log(number); // 11
}
console.log(number); // number is not defined(역시 스코프 밖에서는 접근 불가 
let printNum = () => {
	let number = 4;
}
console.log(number); // number is not defined(함수도 블록이라 접근 못 함)
// 함수 스코프 : 함수 제외하고는 모두 전역변수 
{
	var value = 4;
}
console.log(value); // 4 (일반 블록에선 전역변수) 
function printVarNum {
 	// var이 es6이전 문법이기 때문에, 함수도 es5에 맞춰서 했습니다.
  	var a = 4;
}
console.log(a); // 함수 안에서는 a도 지역변수이기 때문에 a is not defined! 해당 레벨에서 식별자를 찾을 수 없을 때, 바로 에러를 내지 않고, 계속해서 찾을 때 까지(
전역변수 위치까지) 올라가서 식별자를 찾는 것을 의미한다.
{
  let a = 4; // block level && 상위 레벨 
  {
  	console.log(a); // 4
    // 분명 이 블록안에는 a가 선언되어 있지 않다. 
    // 하지만 error를 내지 않고, 상위 scope에서 a가 있는지 찾는다.! 
    // let a = 4; 가 선언할당이 되어 있어서 상위에서 찾아서 출력한다.
  }
}
``함수는 애매하다...
과연 선언된 곳을 기점으로 상위 스코프를 찾아야 할 지!
아니면 호출된 곳을 기점으로 상위 스코프를 찾아야 할 지
함수의 호출 시점을 기점으로 해서 상위 스코프를 찾는 방법
함수의 선언 시점을 기점으로 해서 상위 스코프를 찾는 방법
❗️자바스크립트는 함수의 상위 스코프를 찾을 때 이 방법을 사용함❗️
var : 함수 스코프 (함수를 제외하곤 싹 다 전역변수)
let, const : 블록 스코프 (함수❗️포함❗️한 블록에서 지역변수이고 블록 밖에서만 전역변수