Scope 는 the current context of execution - 변수 실행이 유효한 범위 즉, 변수나 표현식이 유효하게 참조될 수 있는 범위이다. 자바스크립트에서는 기본적으로 함수가 Scope 역할을 하며, 함수 정의와 동시에 Scope 가 생성된다. 몇 가지 규칙은,
for(let i = 0; i < 3; i++) {
console.log(i);
}
console.log(i) // Reference error
for(var i = 0; i < 3; i++) {
console.log(i);
}
console.log(i) // 3
브라우저에서 전역 범위를 대표하며, Global scope 에서 선언된 함수와 var 로 선언한 변수는 모두 window 객체와 연결된다. 여러 프로그램과 라이브러리를 사용할 경우를 고려해 Global scope 에 너무 많은 변수를 선언하지 않는 것이 좋다. 가급적 Local scope 를 만들어서 사용할 것.
const 의 경우 재할당은 할 수 없지만 push, pop 메소드로 새로운 요소를 추가/삭제할 수는 있다.
let, const, var 키워드를 사용하여 값을 재선언하는 것
const myName = 'minjae';
const myName = 'mj'; // SyntaxError
var yourName = 'diva';
var yourName = 'pepe';
console.log(yourName === 'pepe') // true
var 는 Function scope 와 Block scope 에서 다르게 작동한다. Function scope 안에서 정의된 var 는 외부에서 접근이 불가하다.
function tryMe() {
var readMe = 1;
}
console.log(readMe); // ReferenceError: readMe is not defined
하지만 Block scope 안에서 정의된 var 는 외부에서 접근할 수 있다. (!)
for (var i = 0; i < 10; i++) {
// block scope for the for statement
}
console.log(i); // 10 (why oh why)
var 는 값 재정의나 재선언 또한 가능하기때문에, 이렇게 되면 같은 변수명에 새로운 데이터값을 덮어쓰는 상황이 발생하기 쉽다. 그래서 등장하게 된 것이 let, const 키워드이다.
[참고 자료]