์ฐ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ const
, let
, var
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ์ธ๊ฐ์ง ๊ตฌ๋ฌธ์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น?
var
์ ๋ณ์ ์ ์ธ ๋ฐฉ์์์ ํฐ ๋จ์ ์ด ์๊ณ ,
const
์let
์ ES6 ์ดํ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์ถ๊ฐ๋ ๋ณ์ ์ ์ธ ๋ฐฉ์์ด๋ค.
๐ ์ฐจ์ด์ ์์ฝ
var: ์ฌ์ ์ธใ , ์ฌํ ๋นใ , function-scoped
let: ์ฌ์ ์ธx, ์ฌํ ๋นใ , block-scoped
const: ์ฌ์ ์ธx, ์ฌํ ๋นx, block-scoped
ES6(ES2015)์ ์๋ var๊ฐ ์ ์ผํ ๋ณ์ ์ ์ธ ๋ฐฉ์์ด์๋ค.
ํ์ง๋ง var์ ๋๊ฐ์ง ํน์ง์ด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ ๊ฐ์ ธ์จ๋ค.
var language = 'javascript'
console.log(language) // javascript
var language = 'react'
console.log(language) // react
๋ณ์๋ฅผ ๋ค์ ์ ์ธํด๋ ์๋ฌ๊ฐ ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ์ฝ๋๋์ด ๋ง์์ง๋ฉด ์ด์ ์ ์ ์ธ๋ ๋ณ์๋ฅผ ์๋ชป ์ฌ์ ์ธํ๋ ๊ฒฝ์ฐ์์๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ค์์ง๋ ๋ฌธ์ ์ ์ด ์๋ค.
๋ฐ๋ฉด, ์ด๋ฌํ ๋ฌธ์ ์ ์ ๊ฐ์ ํ๊ณ ์ let์ var์ ๋ฌ๋ฆฌ ์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๋ค.
let language = 'javascript'
console.log(language) // javascript
let language = 'react'
console.log(language)
// Uncaught SyntaxError: Identifier 'name' has already been declared
์ง์ญ๋ฒ์๊ฐ ๋ธ๋ก๋จ์์ธ c, c++์ ๊ฐ์ ๋๋ถ๋ถ์ ์ธ์ด์ ๋ฌ๋ฆฌ var๋ ํจ์๋ฒ์์ด๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋๋ฐ ์ ํผ๋์ ์ค ์ ์๋ค.
function hi(){
for(var i = 0; i < 5 ;i++){
console.log(i) // 1, 2, 3, 4
if(true){
var color = "red"
}
}
console.log(i) // 5
console.log(color) // red
}
console.log(i) // error
console.log(color) // error
์ ์์ ์ ๊ฒฝ์ฐ๋ i๋ณ์๋ for๋ฌธ, color ๋ณ์๋ if๋ฌธ ๋ฐ์์๋ ์ ๊ทผ๋ ์ ์์ด์ผ ํ์ง๋ง, var๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค.
let
์ ํจ์๊ฐ ์๋ ๋ธ๋ก ๋ฒ์์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ReferenceError๋ฅผ ์ถ๋ ฅํ๋ค.
function hi(){
for(let i = 0; i < 5 ;i++){
console.log(i) // 1, 2, 3, 4
if(true){
let color = "red"
}
}
console.log(i) // ReferenceError
console.log(color) // ReferenceError
}
๊ฐ์ ๋ธ๋ก ์, ์ฌ์ ์ธ์ ๋ถ๊ฐ๋ฅ, ์ฌํ ๋น์ ๊ฐ๋ฅ
const
๊ฐ var
์ let
์ ๋ค๋ฅธ ์ ์ ์ฌ๋ฌ๋ฒ ์ฌํ ๋น ๋ ์ ์๋ var, let๊ณผ ๋ฌ๋ฆฌ const๋ ํ๋ฒ๋ง ํ ๋น๋ ์ ์๋ ์์๋ผ๋ ๊ฒ์ด๋ค.
var language = 'javascript'
let language2 = 'react'
const language3 = 'react-native'
const temp;
// Uncaught SyntaxError: Missing initializer in const declaration
language = 'javascript'
language2 = 'react'
language3 = 'react-native'
// Uncaught TypeError: Assignment to constant variable.
๋ฐ๋ผ์ const๋ ์ด๊ธฐ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ์ฌํ ๋น์ด ๋๋ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
ํธ์ด์คํ (Hoisting)์ด๋, ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ var ์ ์ธ๋ฌธ์ด๋ function ์ ์ธ๋ฌธ ๋ฑ์ด ํด๋น ์ค์ฝํ์ ์ ๋๋ก ์ฎ๊ฒจ์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ ํน์ฑ์ ๋งํ๋ค.
ํจ์ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ ์์ธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ณ์ ์์ฑ(Instantiation)๊ณผ ์ด๊ธฐํ(Initialization)์ ์์ ์ด ๋ถ๋ฆฌ๋ผ์ ์งํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ES6์์ ๋์ ๋ let, const๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ์ ์ธ(var, let, const, function, function*, class)์ ํธ์ด์คํ ํ๋ค.
// test1.js
console.log(a) // undeined
console.log(b) // undeined
var a = "Hello"
var b = "world"
// test2.js
console.log(a) // ReferenceError
ํธ์ด์คํ ์ ๋ํด ์์๋ณด๊ธฐ ์ undefined์ ReferenceError์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น?
๊ทธ๋ ๋ค๋ฉด test1์ ๊ฒฝ์ฐ, a์ b๊ฐ ReferenceError๋ฅผ ๋ฐ์ํ์ง ์์์ผ๋ฏ๋ก a,b๊ฐ ์ด๋ฏธ ์ ์ธ๋์๋ค๋ ๋ป์ธ๋ฐ ์ด๋ป๊ฒ ๋ ๊ฒ์ผ๊น??
์ฐ๋ฆฌ๋ ๋ณดํต var a = 10
์ด์ ๊ฐ์ด ๋ณ์๋ฅผ ์ ์ธํ๋ค. ํ์ง๋ง ๊ทธ ๋ท๋ฉด์์ javascript๋ ๋ชจ๋ ๋ณ์์ ํจ์๋ฅผ ํธ์ด์คํ
ํ๊ณ ์๋ค.
๋ฐ๋ผ์ test1์ ๊ฒฝ์ฐ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์๋ ๊ฒ์ด๋ค!
์ฆ, test1์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
(์ด๊ธฐํ๊ฐ ์๋ ์ ์ธ๋ง ๋์ด์ฌ๋ฆผ)
var a;
var b;
console.log(a) // undeined
console.log(b) // undeined
a = "Hello"
b = "world"
carName = "Volvo";
let carName;
var๋ก ์ ์ธ๋ ๋ณ์์ ๋ฌ๋ฆฌ let
์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ธ๋ ๋๊น์ง ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ๋ฉด ReferenceError๊ฐ ๋ฐ์ํ๋ค.
carName = "Volvo";
const carName;
const
์ ์ธ๋๊ธฐ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ตฌ๋ฌธ ์ค๋ฅ์ด๋ฏ๋ก ์ฝ๋๊ฐ ์คํ๋์ง ์๋๋ค.
sayHello(); // Output: 'Hello'
function sayHello() {
console.log('Hello');
};
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ปดํ์ผ ๋จ๊ณ์์ ํธ์ด์คํ ๋ ๋ณ์์ ํจ์๋ค์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ค. ๋ฐ๋ผ์ ํจ์์ ๊ฒฝ์ฐ๋ var์ ๊ฐ์ด ๋งจ์๋ก ์ ์ธ์ด ๋๋ฏ๋ก ์ ์ฝ๋์์ sayHello๋ ์๋ ์ ์ธ๋ ํจ์๋ฅผ ์คํํ์ฌ 'Hello'๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ง๋ง ์ด๋ฌํ ์ด์ (ํจ์๋ฅผ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น ๋จ)๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ ๋ฌธ๊ฐ๋ค์ ํจ์ ์์ฑ์ ์์ด์ ํจ์ ์ ์ธ์(Function declarations)๋ณด๋ค ํธ์ด์คํ
์ ์ํฅ์ ๋ฐ์ง ์๋ํจ์ ํํ์(Function expressions)
๋ง์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค.
ํจ์ํํ์์ ์ด์ฉํ์ฌ ์ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํด๋ณด์.
sayHello(); // Uncaught TypeError: sayHello is not a function
var sayHello = function() {
console.log('Hello');
};
์ด ๊ฒฝ์ฐ var = sayHello
๋ง ์๋จ๋ถ๋ก ํธ์ด์คํ
์ด ๋๋ฏ๋ก ์ค์ง์ ์ธ ํจ์ ๋ด์ฉ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ธ๋ค. ์ด๋ ๊ฒ ํจ์ ํํ์์ผ๋ก ํจ์๋ฅผ ์์ฑํ ๊ฒฝ์ฐ sayHello()๋ undefined()๋ก TypeError๋ฅผ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํจ์๋ฅผ ์ ์ํ ๋ค์์ ์ฌ์ฉํด์ผ ํ๋ค.
Understanding Hoisting in JavaScript
18: Hoisting in JavaScript Explained | What is Hoisting in JavaScript | JavaScript Tutorial