변수에 접근할 수 있는 범위 라고 볼 수 있다.
변수와 그 값이 어디서부터 어디까지 유효한지 판단하는 범위이다.
let greeting = 'Hello';
function greetSomeone() {
let firstName = 'Nam';
return greeting + ' ' + firstName;
}
greetSomeone(); //Hello Nam
firstName;
VM427:1 Uncaught ReferenceError: firstName is not defined
at <anonymous>:1:1
이는 firstName이란 변수가 정의된 적 없다는 에러가 발생하는데 이 이유는 무엇일까?
안쪽에 접근 할 수가 없기 때문에
그게 바로 scope라는 개념이다.
Local Scope 안쪽에서 선언된 변수는 밖에서는 사용이 불가하다.
보통의 경우에는 이 블록을 기준으로 Scope를 구분하는 단위로 생각할 수 있다.
for(let i=0; i<5; i++) {
console.log(i); // 다섯번 iteration (0,1,2,3,4)
}
console.log('final i:', i); // ?
VM779:4 Uncaught ReferenceError: i is not defined
at <anonymous>:4:25
(anonymous) @ VM779:4
for(var i=0; i<5; i++) {
console.log(i); // 다섯번 iteration
}
console.log('final i:', i); // 5
외부함수의 변수에 접근할 수 있는 내부함수를 말한다.
function outter(){
var title = 'coding everybody'; // 외부 함수
return function(){ // 내부 함수
alert(title);
}
}
inner = outter(); // 결과값이 없다.
inner(); // 실행 결과는 alert(title);
클로저란 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다.