변수가 접근할 수 있는 범위가 존재한다.
자바스크립트는 기본적으로 함수가 선언되는 동시에 자신만의 스코프를 가진다.
로 나눌 수 있다. 로컬에서 선언된 변수는 전역에서 참조할 수 없지만, 전역에서 선언된 함수는 로컬에서 참조할 수 있다.
블록 스코프는 let에서만 사용이 가능하다. 이유는 뒤에.......
// let을 밖으로 빼낼 경우
for(let i=0; i<5; i++) {
console.log(i);
}
console.log('final i:' , i); //error
for(var i=0; i<5; i++) {
console.log(i);
}
console.log('final i:' , i);
//5
스코프를 구분하는 단위로 가장 많이 사용한다.
block 범위를 벗어나는 즉시 변수를 사용할 수 없다. (e.g. for 구문의 i)
function greeting(firstName) {
var time = 'night';
if(time === 'night') {
var greeting = 'good night';
}
return greeting + ' ' + firstName;
}
greeting('rara') //good night rara
//var는 function 안에서 돌기 때문에 function 안에서는 자유롭게 가능하다
function greeting(firstName) {
let time = 'night';
if(time === 'night') {
let greeting = 'good night';
}
return greeting + ' ' + firstName;
}
greeting('rara')
//error
//let는 block로 돌기 때문에 if문에 있는 greeting은 if block에서 끝난다
var 형식은 기본적으로 함수 단위로 자신만의 스코프를 가지게 된다. var는 블록형이 아닌 함수형이므로, 블록 범위를 벗어나도 (같은 function scope에서는) 사용이 가능하기 때문에 혼동하기 쉽다.
let 키워드는 block 단위로 scope를 구분하기 때문에 예측하기 쉬운 코드를 작성할 수 있다. let은 블록형으로 스코프를 가지기 때문에, 함수 안의 for문이나 if문에서 정의를 했을 때, 그것을 밖으로 꺼내어 사용할 수가 없다.
값이 변하지 않는 변수, 즉, 상수를 정의할 때 사용한다.
let 키워드와 동일하게 Block Scope를 따르지만 "값이 변하지 않는 변수"라서 값을 재정의하려고 하면 타입 에러를 낸다.
ex) const pi = 3.14
값이 더러워지지 않기를 원한다면 const를 쓰는 게 좋다.
let | const | var | |
---|---|---|---|
유효 범위 | block | block | function |
값 재정의 | 가능 | 불가능 | 가능 |
재선언 | 불가능 | 불가능 | 가능 |
var은 old way
, 기본 값이었다. 그런데 사람들이 block 안에 변수 선언을 하게 되면 block 안에 갇힐 거라고 생각을 하기 때문에 function scope를 많이 헷갈려 했기에 let과 const가 생겨났다.
var로 선언된 변수와 전역 변수는 window 객체와 연결된다.
//전역에 선언한 함수
function foo() {
console.log('bar');
}
window; //search foo => find
var myName = 'paul';
window; //search myName => find
let은 window 객체에 담기지 않는다.
전역 범위(global scope)에 너무 많은 변수를 선언하지 않도록 주의해야 한다.
전역 범위는 최상위 스코프이기 때문에, 어떠한 라이브러리가 어떠한 변수를 사용할지 모른다. 그래서 겹칠 수가 있으니까 브라켓 안쪽에서 사용하는 게 좋다.
절대로 선언 키워드 없이 변수를 초기화하지 않는다.
실수를 방지하고 싶으면?