๐ก ๊ธฐ์กด์ ์ฌ์ฉํด์๋ var์ ES6์์ ์๋กญ๊ฒ ๋ฑ์ฅํ ํค์๋์ธ let, const์ ์ฐจ์ด์ ์์ฃผ๋ก ์์ฑํ ์์ ์ ๋๋ค.
๊ธฐ์กด ES6 ๋์ ์ ์๋ ๋ณ์ ์ ์ธ ํค์๋๋ก var๋ง ์กด์ฌํ์๋ค. ๊ทธ๋ ๋ค๋ฉด const์ let์ด ๋ฑ์ฅํ๊ฒ ๋ ๋ฐฐ๊ฒฝ์ ๋ฌด์์ผ๊น? var๋ก๋ ํด๊ฒฐํ๊ธฐ ํ๋ ์ด๋ค ๋ฌธ์ ์ ์ด ์์๋ ๊ฒ์ผ๊น?
var์ let, const๊ฐ ๊ฐ์ง๋ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ค ํ๋๋ scope์ด๋ค. scope๋ ๋๋ถ๋ถ์ ์ธ์ด์์ ๊ฐ์ง๊ณ ์๋ ๊ฐ๋ ์ผ๋ก, ์๋ณ์๊ฐ ์ ํจํ ๋ฒ์๋ฅผ ๋งํ๋ค.
์ฐ์ var์์์ scope๋ฅผ ์ดํด๋ณด์. ์๋ฐ์คํฌ๋ฆฝํธ์์ var์ ๋ธ๋ก ๋ ๋ฒจ scope๊ฐ ์๋ ํจ์ ๋ ๋ฒจ์ scope๋ง ์ธ์ ํ๋ค. ์ฆ ํจ์์ ์ฝ๋ ๋ธ๋ก๋ง์ ์ง์ญ scope๋ก ์ธ์ ํ๋ค!
๋ฐ๋ผ์, ํจ์๊ฐ ์๋ if๋ฌธ์ด๋ for๋ฌธ ์์ ์ ์ธํ ๋ณ์๋ค๋ ๋ชจ๋ ์ ์ญ๋ณ์๊ฐ ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
var x = 1;
if (true) {
var x = 10 // ๋ธ๋ก scope๊ฐ ์ธ์ ๋์ง ์๋๋ค.
}
console.log(x); // 10
for (var i = 0; i < 100; i++) {
// do nothing
}
console.log(i); // 100
์ ์ฝ๋๋ฅผ ์ดํด ๋ณด๋ฉด, if๋ฌธ ๋ธ๋ก ์์ ์ ์ธ๋ x์ for ๋ธ๋ก์์ ์ ์ธ๋ i๊ฐ ์ ์ญ ๋ณ์๋ก์ ์ทจ๊ธ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด์ฒ๋ผ var์ ์ ์ธํ๋ฉด ์๋์น ์๊ฒ ๋ค์์ ์ ์ญ ๋ณ์๋ฅผ ๋ง๋ค๊ฒ ๋๊ณ , ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ๋ณต์กํด์ง๋ฉด ์์ํ์ง ๋ชปํ ์ค์ฝํ๋ก ์ธํด ๊ฐ๋ฐ์๊ฐ ์๋ํ์ง ์์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ํ์ฑ์ด ์๋ค.
let๊ณผ const ํค์๋๋ ๋ธ๋ก ๋ ๋ฒจ scope๋ฅผ ๊ฐ์ง ์ ์๋ ๋ณ์ ์ ์ธ ๋ฐฉ์์ด๋ค.
let x= 1; // ์ ์ญ๋ณ์
const y = 2;
if (true) {
let x = 10 //์ง์ญ๋ณ์
const y = 20;
console.log(x) // 10
console.log(y) // 20
}
console.log(x); //1
console.log(y); // 2
์์ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด if๋ฌธ ์์์ ์ ์ธ๋ x, y๋ ์ง์ญ๋ณ์๋ก์ ์ ์ญ ๋ธ๋ก์ ์ ์ธ๋ x, y์ ๊ตฌ๋ณ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
let ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ๋ชจ๋ ์ฝ๋ ๋ธ๋ก์ ์ง์ญ scope๋ก ์ธ์ ํ๋ ๋ธ๋ก ๋ ๋ฒจ scope๋ฅผ ๋ฐ๋ฅธ๋ค! const๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
์ด๋ฒ์๋ ๋ณ์ ํธ์ด์คํ ๊ด์ ์์ var๊ณผ let,const์ ์ฐจ์ด๋ฅผ ์์๋ณด์!
var ํค์๋๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๋ณ์ ํธ์ด์คํ ์ ์ํด ๋ณ์ ์ ์ธ๋ฌธ์ด ์ค์ฝํ์ ์ ๋๋ก ๋์ด ์ฌ๋ ค์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฐํ์ ์ด์ ์ ์ฝ๋๋ฅผ ์ฝ์ผ๋ฉฐ var๋ก ์ ์ธ๋ ๋ชจ๋ ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค๊ณ undefined๋ก ์ด๊ธฐํํ๋ค. ์ฆ, ์ ์ธ์ ํธ์ด์คํ ๋์ง๋ง ํ ๋น์ ํธ์ด์คํ ๋์ง ์๋๋ค.
console.log(foo) // undefined
foo = 123
console.log(foo) /// 123
var foo;
์์ ๊ฐ์ ์ฝ๋๋ ์ค์ ๋ก ๋ณ์ ์ ์ธ๋ฌธ์ด ์ ๋๋ก ๋์ด ์ฌ๋ ค์ง๊ฒ ๋์ด, ์๋์ ๊ฐ์ด ๋์ํ๋ค.
var foo = undefined;
console.log(foo); // undefined
foo = 123;
console.log(foo) // 123
let๋ ๋ฐํ์ ์ด์ ์ ์ ์ธ์ด ์คํ๋๋ฉฐ ๋ณ์ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค. ํ์ง๋ง let์ ์ฝ๋๊ฐ ๋ณ์ ์ ์ธ๋ฌธ์ ๋์ฐฉํ๊ธฐ ์ ์๋ ์ด๊ธฐํ๊ฐ ์งํ๋์ง ์์ผ๋ฉฐ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค!
๋ณ์ ์ ์ธ๋ฌธ์ ๋์ฐฉํด์์ผ undefined๋ก ์ด๊ธฐํ๊ฐ ์งํ๋๋ค.
console.log(foo)
// ReferenceError: Cannot access 'foo' before initialization
// var๊ณผ ๋ฌ๋ฆฌ ์ ์ธ๋ฌธ ์ ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด error๋ฅผ ๋ฐ์์ํจ๋ค.
let foo; // ์ด ๋ผ์ธ์ด ์ง๋์ผ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
console.log(foo) // undefined
foo = 1;
console.log(foo) // 1
const์ ๊ฒฝ์ฐ๋ let๊ณผ ๊ฐ์ง๋ง ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํ๋ฅผ ํด์ผํ๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
console.log(foo) // ReferenceError: Cannot access 'foo' before initialization
const foo = 1; // ์ฌ๊ธฐ์์์ผ ๋ณ์๊ฐ ์ด๊ธฐํ ๋จ
console.log(foo) // 1
ํ์ง๋ง ์ญ์ const๋ ์ฒ์ console.log(foo)
๋ผ์ธ์ด ReferenceError: Cannot access 'foo' before initialization ๋ฅผ ๋ฐ์ ์ํค๋ ๊ฒ์ผ๋ก ๋ณด์ ๋ณ์ ํธ์ด์คํ
์ด ๋ฐ์ ํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
++ 20-12-25 ์ถ๊ฐ!
์คํ ์ปจํ ์คํธ๋ฅผ ๊ณต๋ถํ๋๋ ๋ณ์ ํธ์ด์คํ ์ ์๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์๋ค. (์์ธํ ์๋ฆฌ๊ฐ ๊ถ๊ธํ์ ๋ถ๋ค์ ์คํ ์ปจํ ์คํธ ํฌ์คํ ์ ์ฝ์ด๋ณด์ธ์!)
var ํค์๋๋ก ์ ์ธํ ์ ์ญ ๋ณ์, ์ ์ญ ํจ์, ๊ทธ๋ฆฌ๊ณ ์ ์ธํ์ง ์์ ๋ณ์์ ๊ฐ์ ํ ๋นํ ์๋ฌต์ ์ ์ญ์ ์ ์ญ ๊ฐ์ฒด window์ ํ๋กํผํฐ๊ฐ ๋๋ค
var x = 1;
console.log(window.x); // 1
console.log(x); // 1
๋ฐ๋ฉด let๊ณผ const ํค์๋๋ก ์ ์ธํ ์ ์ญ ๋ณ์๋ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ์๋๋ค.
let x = 1;
const y = 2;
console.log(window.x); // undefined
console.log(x); // 1
console.log(window.y); // undefined
console.log(y); //2
var์ด ๊ฐ์ง๊ณ ์์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด let๊ณผ const๊ฐ ๋์จ ๋งํผ,
ES6์์๋ var ์ฌ์ฉ์ ์ง์ํ๊ณ let๊ณผ const๋ฅผ ์ฌ์ฉํ๋๋ก ํ์!