스코프는 함수 또는 코드 블록을 기준으로 안쪽과 바깥쪽으로 나뉘는 것을 말한다.
안쪽에 있는 스코프는 바깥쪽의 스코프에 있는 변수에 접근할 수 있지만
바깥쪽에 있는 스코프는 안쪽의 스코프에 있는 변수에 접근할 수 없다.
스코프는 중첩이 가능하다.
가장 바깥쪽에 있는 스코프는 전역 스코프라고 한다.
전역이 아닌 다른 모든 스코프는 지역 스코프이다.
지역 변수는 전역 변수보다 높은 우선 순위를 가진다.
const halve = function(n) {
return n / 2;
};
let n = 10;
console.log(halve(100)); // 50
console.log(n) // 10;
함수나 코드 블록 외부에서 정의한 변수의 범위는 프로그램 전체이고 이는 어디서든지 참조할 수 있다.
함수의 매개 변수나 함수 안에서 선언한 변수는 해당 함수에서만 참조할 수 있다.
중괄호 { }
기준으로 구분되는 범위를 말한다.
function
키워드가 등장하는 함수 선언식 또는 함수 표현식은 함수 스코프를 만든다.
화살표 함수는 블록 스코프로 취급된다.
const myGuacamole = function(factor) {
const ingredient = function(amount, name) {
let ingredientAmount = amount * factor;
if (ingredientAmount > 0) {
name += 's';
}
return `${ingredientAmount} ${name}`;
}
return `${ingredient(0.5, 'avocado')} ${ingredient(1, 'tomato')} ${ingredient(0.5, 'onion')}`
}
클로저는 함수와 함수가 선언된 언어적(lexical) 환경의 조합을 말한다.
자바스크립트는 함수가 호출되는 환경과는 별개로 기존에 선언되어 있던 환경(언어적 환경)을 기준으로 변수를 조회하려고 한다.
클로저 함수는 외부 함수의 실행이 종료된 후에도
외부 함수의 스코프(함수가 선언된 언어적 환경)에 접근할 수 있다.