● 스코프(Scope) 영어 단어 자체는 범위라는 의미이다
● 자바스크립트에서도 범위하는 의미를 가지고 있다
● 스코프의 정의는 식별자 접근 규칙에 따른 유효 범위이다
● 식별자(변수, 함수, 클래스)에 접근할 수 있는 범위가 존재한다
● 범위는 중괄호(블록) 또는 함수에 의해 나눠진다 (그 범위를 스코프라 부름)
● 그래서 각각을 Block Scope와 Function Scope라 부름
● 바깥쪽 스코프에서 선언한 식별자는 안쪽 스코프에서 사용 가능하다
● 반면 안쪽에서 선언한 식별자는 바깥쪽 스코프에서는 사용할 수 없다
● 가장 바깥쪽의 스코프를 전역 스코프(Global Scope)
● 전역이 아닌 다른 스코프는 전부 지역 스코프(Local Scope)
● 전역 스코프에서 선언한 변수는 전역 변수이다
● 지역 스코프에서 선언한 변수는 지역 변수이다
● 지역 변수는 전역 변수보다 더 높은 우선순위를 가진다
const 키워드
● 유효 범위: 블록 스코프/ 함수 스코프
● 값 재할당: 불가능
● 재선언: 불가능
let 키워드
● 유효 범위: 블록 스코프/ 함수 스코프
● 값 재할당: 가능
● 재선언: 불가능
var 키워드
유효 범위: 함수 스코프
값 재할당: 가능
재선언: 가능
블록 스코프 안에서 let과 const 키워드로 선언한 변수는 스코프 안에서만 참조가 가능하지만
var 키워드로 선언한 변수는 블록 스코프를 무시하고 스코프 울타리 밖에서도 접근이 가능하다(var는 Only 함수 스코프만 따른다)
● 가장 바깥 스코프에 정의한 변수가 전역 변수이다(즉, 어디서든 접근이 가능하다)
● 전역 변수를 최소화 하면 side effect(의도치 않은 로직에 의해 문제 발생) 를 줄일 수 있다
● 그런데 전역 변수를 var로 선언하는 경우 문제가 될 수 있다
1. 전역 변수는 어디서나 접근 가능
2. var 키워드는 블록 스코프를 무시
3. 재선언과 재할당이 가능
4. 전역 변수를 var로 선언해서 브라우저의 내장 기능을 못하게 만들 수도 있다
● 선언 없이 변수를 할당하면 해당 변수는 var로 선언한 전역 변수 처럼 취급 된다
● 실수를 방지하기 위해 Strict Mode를 사용할 수 있다
1. Strict Mode는 브라우저가 보다 엄격하게 작동하도록 만들어준다
2. 선언 없는 변수 할당의 경우도 에러로 판단해준다
3. 적용하려면 js파일 상단에 'use strict' 러고 입력하면 된다(다옴표 포함이다)