지역 변수를 선언하려면 예약어 var과 함께 변수를 선언해야됨.<script>
function addNumber() {
var sum = 10 + 20; // 지역 변수 선언
}
addNumber();
console.log(sum); // 지역 변수 sum 출력.
</script>
![]() | ![]() |
지역 변수 sum을 addNumber() 함수 안에서 선언하였는데 함수 바깥에서 console.log()로 출력하려고 해서 에러가 발생.전역 변수로 선언하려면 함수 바깥에서 선언하거나 함수 안에서 var를 사용하지 않고 선언하면 됨.스크립트 소스 코드 전체에서 사용 가능.<script>
var num = 10;
function addNumber() {
var sum = 10 + 20; // 지역 변수
multi = 10 * 20; // 전역 변수
}
addNumber();
console.log(multi);
console.log(num);
</script>

var를 사용한 변수는 재선언, 재할당을 할 수 있음.<script>
function addNumber(num1, num2) {
return num1 + num2;
}
var sum = addNumber(10, 20); // 선언
console.log("sum = ", sum);
sum = 50; // 재할당
console.log("sum = ", sum);
var sum = addNumber(20, 20); // 재선언
console.log("sum = ", sum);
sum = 100; // 재할당
console.log("sum = ", sum);
</script>

hoisting = 끌어올린다변수의 선언과 할당을 분리해서 선언 부분을 스코프의 최상단으로 끌어올려서 소스를 해석함.// ↓ 원본 코드
<script>
var x = 1;
function displayNumber() {
console.log("x = " + x);
console.log("y = " + y);
var y = 2;
}
displayNumber();
</script>
// ↓ 자바스크립트 인터프리터가 해석한 코드
<script>
var x = 1;
function displayNumber() {
var y // (호이스팅(hoisting))
console.log("x = " + x);
console.log("y = " + y);
y = 2;
}
displayNumber();
</script>

호이스팅때문에 위와 같은 결과가 나타남.var 변수는 선언하기 전에 사용할 경우 프로그램에서 에러가 발생할 수 있음.var를 자칫 잘못 사용하면 예상치 못한 결과가 발생하게 되어 프로그램에서 에러가 발생할 수 있음.
ES6부터는 var 사용을 지양하고 let, const 사용을 지향함.
var는 함수 영역의 스코프를 가짐.let, const는 블록 영역의 스코프를 가짐.let 변수는 변수를 선언한 블록({})에서만 유효하고 블록을 벗어나면 사용할 수 없음.<script>
function calcSum(n) {
let sum = 0;
for(let i = 1; i < n + 1; i++) {
sum += i;
}
console.log(sum);
}
calcSum(10);
console.log(sum); // Uncaught ReferenceError: sum is not defined
</script>
let sum을 사용할 수 있는 범위는 calcSum() 함수 내부에서만 사용할 수 있음.let i를 사용할 수 있는 범위는 for() 반복문 내부에서만 사용할 수 있음.전역 변수로 선언하고 싶다면 변수 이름과 초깃값만 할당하면 됨.<script>
function calcSum(n) {
sum = 0; // 전역 변수.
for(let i = 1; i < n + 1; i++) {
sum += i;
}
}
calcSum(10);
console.log(sum);
</script>
let 변수는 값을 재할당할 수는 있지만 재선언할 수는 없음.재할당
<script>
function calcSum(n) {
let sum = 0;
for(let i = 1; i < n + 1; i++) {
sum += i;
}
console.log("첫 번째 sum : " + sum);
sum = 100;
console.log("두 번째 sum(값 재할당) : " + sum);
}
calcSum(10);
</script>

재선언
<script>
function calcSum(n) {
let sum = 0;
for(let i = 1; i< n + 1; i++) {
sum += i;
}
console.log("첫 번째 sum : " + sum); // 콘솔창 출력자체가 안됨.
let sum; // Uncaught SyntaxError: Identifier 'sum' has already been declared
console.log("두 번째 sum(변수 재선언) : " + sum);
}
calcSum(10);
</script>

var 변수의 경우 변수를 선언하기 전에 해당 변수를 사용해서 실행하더라도 아직 할당되지 않는 자료형인 undefined 값을 가질 수 있음.let 변수의 경우 변수를 선언하기 전에 해당 변수를 사용할 경우 에러가 발생함. <script>
var x = 10;
function displayNumber() {
console.log("x is " + x);
console.log("y is " + y); // 변수 선언보다 먼저 사용. (Uncaught ReferenceError: Cannot access 'y' before initialization)
let y = 20;
}
displayNumber();
</script>

const로 선언한 변수는 상수(constant)임.const를 사용함.블록 레벨의 스코프를 가짐.재선언
<script>
const currentYear = 2020;
console.log(currentYear);
// const currentYear; // Uncaught SyntaxError: Identifier 'currentYear' has already been declared.
console.log(currentYear);
</script>

재할당
<script>
const currentYear = 2020;
console.log(currentYear);
currentYear = 2100; // Uncaught TypeError: Assignment to constant variable.
console.log(currentYear);
</script>

let, const를 사용하는 것이 좋음.let을 사용. 재할당이 없는 변수라면 const를 사용.자바스크립트는 유연해서 편리한 언어이지만 이로인해 소스코드가 많아질수록 가독성이나 디버깅을 하기 어려움.전역 변수는 최소한으로 사용.전역 변수는 어디서든 접근할 수 있으므로 편리하지만 예상하지 못한 곳에서 값이 달라질 수도 있음.전역 변수는 되도록 적게 사용하는 게 좋음.var 변수는 함수 시작 부분에서 선언.for 문에서 카운터 변수를 사용할 때는 var를 사용하지 않음.var 변수는 함수 레벨의 스코프임.for 문 바깥에서 var 변수로 선언하거나let 변수를 사용해서 블록 변수로 선언하는 것이 좋음.var i;
for (i = 1; i <= n; i++) {
...
}
for (let i = 1; i <= n; i++) {
...
}
ES6에서는 var 보단 let을 사용하는 게 좋음.var를 사용해서 선언한 변수는 재선언할 수 있으므로 실수로 같은 변수를 다시 선언하더라도 에러가 발생하지 않음.재선언할 수 없는 let을 사용하는 것이 좀 더 안전함.