# const & let

const์™€ let ์˜ˆ์•ฝ์–ด๋Š” ES6์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

# let

let ์˜ˆ์•ฝ์–ด๋Š” ํ•œ๋ฒˆ ์„ ์–ธํ•˜๋ฉด ๋‹ค์‹œ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

// ๋˜‘๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์žฌ์„ ์–ธํ•  ๋•Œ ์˜ค๋ฅ˜
let a = 10;
let a = 20; // Uncaught SyntaxError: Identifier 'a' has already been declared

# const

const ์˜ˆ์•ฝ์–ด๋Š” ํ•œ๋ฒˆ ํ• ๋‹นํ•œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

// ๊ฐ’์„ ๋‹ค์‹œ ํ• ๋‹นํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜
const a = 10;
a = 20; // Uncaught TypeError: Assignment to constant variable.

๋‹จ, ๊ฐ์ฒด {}๋˜๋Š” ๋ฐฐ์—ด []๋กœ ์„ ์–ธํ–ˆ์„ ๋•Œ๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ(property)๊ณผ ๋ฐฐ์—ด์˜ ์š”์†Œ(element)๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๊ฐ์ฒด๋กœ ์„ ์–ธํ•˜๊ณ  ์†์„ฑ ๊ฐ’์„ ๋ณ€๊ฒฝ
const b = {
    num: 10,
    text: 'hi'
};
console.log(b.num); // 10

b.num = 20;
console.log(b.num); // 20
// ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๊ณ  ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€
const c = [];
console.log(c); // []

c.push(10);
console.log(c); // [10]

# ๋ธ”๋ก ์œ ํšจ๋ฒ”์œ„

ES5์˜ var๋ฅผ ์ด์šฉํ•œ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹๊ณผ let & const๋ฅผ ์ด์šฉํ•œ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๋ธ”๋ก ์œ ํšจ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.

# var์˜ ์œ ํšจ ๋ฒ”์œ„

var์˜ ์œ ํšจ ๋ฒ”์œ„๋Š” ํ•จ์ˆ˜์˜ ๋ธ”๋ก ๋‹จ์œ„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํ”ํžˆ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„(function scope)๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

var a = 100;
function print() {
    var a = 10;
    console.log(a);
}
print(); // 10

print ํ•จ์ˆ˜ ์•ž์— ์„ ์–ธํ•œ a์™€ print ํ•จ์ˆ˜ ์•ˆ์— ์„ ์–ธํ•œ a๋Š” ๊ฐ์ž ๋‹ค๋ฅธ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. var a = 100; ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์—ญ ๊ฐ์ฒด์ธ window์— ์ถ”๊ฐ€๊ฐ€ ๋˜๊ณ  var a = 10;๋Š” print() ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•œ ๋ฒ”์œ„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

# for ๋ฐ˜๋ณต๋ฌธ์—์„œ์˜ var ์œ ํšจ ๋ฒ”์œ„

์œ„์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด ํ”ํžˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด "var์˜ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ {}์— ์ œํ•œ๋˜๋‚˜?" ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

var a = 10;
for (var a = 0; a < 5; a++) {
    console.log(a); // 0 1 2 3 4 5
}
console.log(a); // 6

var a = 10;๋กœ ๋ณ€์ˆ˜ a๋ฅผ ์„ ์–ธํ•œ ์ƒํƒœ์—์„œ for ๋ฐ˜๋ณต๋ฌธ์— ๋™์ผํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„ a๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด {} ์œผ๋กœ ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— for ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚˜๊ณ  ๋‚˜์„œ console.log(a); ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด for ๋ฐ˜๋ณต๋ฌธ์˜ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ ๊ฐ’์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ ์ž๋ฐ”๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋Š” ์ด ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค๋ฅธ ์–ธ์–ด์™€ ํ†ต์ผ๊ฐ์„ ์ฃผ๊ธฐ ์œ„ํ•ด ES6์—์„œ๋Š” const์™€ let์˜ ๋ณ€์ˆ˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋ธ”๋ก{}์œผ๋กœ ์ œํ•œํ•˜์˜€์Šต๋‹ˆ๋‹ค.

# const์™€ let์˜ ๋ธ”๋ก ์œ ํšจ๋ฒ”์œ„

์ด๋ฒˆ์—” ์œ„ ๋ฐ˜๋ณต๋ฌธ ์ฝ”๋“œ์— var ๋Œ€์‹  let์„ ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

var a = 10;
for (let a = 0; a < 5; a++) {
    console.log(a); // 0 1 2 3 4 5
}
console.log(a); // 10

๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด ๋ณ€์ˆ˜ a๋ฅผ let์œผ๋กœ ์„ ์–ธํ•˜๋‹ˆ ๋ณ€์ˆ˜์˜ ์œ ํšจ ๋ฒ”์œ„๊ฐ€ for ๋ฐ˜๋ณต๋ฌธ์˜ {} ๋ธ”๋ก ์•ˆ์œผ๋กœ ์ œํ•œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.