๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ฐ์ด๋ '์ด๋ฆ์ด ๋ถ์ ์ ์ฅ์'๋ฅผ ์๋ฏธํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ var
, let
, const
๋ผ๋ ์ด 3๊ฐ์ง ํค์๋๋ฅผ ์ฌ์ฉํด ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค.
๋ํ, ํ ๋น ์ฐ์ฐ์(=)๋ฅผ ์ฌ์ฉํด ๊ฐ์ ํ ๋นํ๋ฉฐ, ์๋ณ์์ธ ๋ณ์๋ช
์ ์ฌ์ฉํด ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ฐธ์กฐํ๋ค.
๋ณ์๋ช
์ ์๋ณ์(identifiers)๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ์์ฑ์ ๋ฌธ์ ํน์ _ ํน์ $ ๋ก ์์ํด์ผ ํ๊ณ , ๊ทธ ์ดํ์๋ ์ซ์๋ฅผ ์
๋ ฅํ ์ ์๋ค. JS๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ์ ๋ฌธ์ ์์ฑ์ ๋์๋ฌธ์๋ ์ ์ํด์ผ ํ๋ค.
์ฐธ๊ณ ๋ก ๋ณ์๋ฅผ ์ ์ธ๋ง ํ๊ณ ๊ฐ์ ํ ๋นํ์ง ์์ ๊ฒฝ์ฐ, ์ด๊ธฐ๊ฐ์ผ๋ก undefined
๋ฅผ ๊ฐ๋๋ค.
๋ณ์๋ ์ ์ธ ์์น์ ์ํด ์ค์ฝํ๋ฅผ ๊ฐ๋๋ค. ์ฆ, ์ ์ญ์์ ์ ์ธ๋ ๋ณ์๋ ์ ์ญ ์ค์ฝํ, ์ง์ญ(ํจ์ ๋ด์์) ์ ์ธ๋ ๋ณ์๋ ์ง์ญ ์ค์ฝํ๋ฅผ ๊ฐ๋ ์ง์ญ ๋ณ์๊ฐ ๋๋ค.
function a(){
if(true){
var fruit = "apple";
console.log(fruit);//apple
}
console.log(fruit);//apple
}
console.log(furit);//Uncaught ReferenceError: furit is not defined
a();
function a(){
if(true){
const fruit = "apple";
console.log(fruit);//apple
}
console.log(fruit);//Uncaught ReferenceError: fruit is not defined
}
๋ณ์๋ช ์ด ๊ฐ์ ๋ณ์์ ํ ๋น์ ์ฌ๋ฌ ๋ฒ ํ๋ ๊ฒ
let A =1
A =2 // let์ ์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ let A =2 ๋ก ์ฐ๋ฉด ์ ๋๋ค
console.log(A) // 2
๋ณ์๋ช ์ด ๊ฐ์ ๋ณ์๋ฅผ ์ค๋ณตํด ์ ์ธํ๋ ๊ฒ
var B ="banana"
console.log(B) // banana
var B = "book"
console.log(B) //book
์ ์ธ๋ฌธ์ด ํด๋น scope์ ๋งจ์๋ก ์ฎ๊ฒจ์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ ํน์ฑ(hoist๋ ๋๋ ค์ฌ๋ ค์ง๋ค๋ ๋ป)
์ฐธ๊ณ ๋ก, ์ ์ธ์ ํธ์ด์คํ
๋์ง๋ง ํ ๋น์ ํธ์ด์คํ
๋์ง ์๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด๋,
function sayHi(){
alert(phrase);
var phrase="Hello"
}
sayHi();
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ ๊ฒ ์ฝ๋๋ค.
function sayHi(){
var phrase;
alert(phrase);
phrase="Hello"
}
sayHi(); // ์ ์ธ์ด ์๋ก ํธ์ด์คํ
๋๋ฏ๋ก alert์ฐฝ์ด ์ ์๋ํ๋ค.
ํจ์ ์ญ์ ํธ์ด์คํ ๋ ์ ์๋๋ฐ,
ํจ์()
var ํจ์=function (){์ด์ฉ๊ตฌ์ฝ๋}
์ด๋ฐ ๊ฒฝ์ฐ ์ญ์ var์ ์ ์ธ๋ถ๋ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๊ทธ๋ฌ๋ ์ค์ํ ๊ฑด ์ ์ธ๋ถ๋ง ์ฌ๋ผ๊ฐ์ง, ํ ๋น๋ถ๋ถ์ ํธ์ด์คํ ๋์ง ์๋๋ค๋ ์ฌ์ค.
var ํจ์;
ํจ์()
ํจ์=function (){์ด์ฉ๊ตฌ์ฝ๋}
์๋ฐ์คํฌ๋ฆฝํธ๋ ์์ ๊ฐ์ด ์ฝ์ ํ
๋ฐ, var ํจ์
์ด๊ฒ๋ง ๋ด์๋ function์ธ์ง ์ ์ ์๋ค. ๊ทธ๋์ ํจ์()
๋ฅผ ์คํํ๋ฉด undefined๊ฐ ์๋ error๊ฐ ๋์จ๋ค.
์ ์ธ ๋จ๊ณ ---> ์ด๊ธฐํ ๋จ๊ณ ---> ํ ๋น ๋จ๊ณ
์๋ฐ ์คํฌ๋ฆฝํธ๋ ์ฐ๋ฆฌ๊ฐ ์ด ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ , ์ฝ๋ ์ ์ฒด๋ฅผ ํ์ผ๋ฉด์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ์ด๋ฅผ ์คํ ์ปจํ
์คํธ Execution phase(์คํ ๋จ๊ณ)๋ผ๊ณ ํ๋๋ฐ, ์ ์ธ๋จ๊ณ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ์ปจํ
์คํธ(Execution phase)์์ ์งํ๋๋ค.
์ด ๊ณผ์ ์์ ์คํ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๊ณ , ๋ณ์์ ํจ์๋ฅผ ๋ฑ๋กํ๋ค.
์ฝ๊ฒ ๋งํด ์ปดํจํฐ์ ๋ด๊ฐ ์ด ๋ณ์, ํจ์์ ์กด์ฌ๋ฅผ ์๋ฆฌ๋ ์ญํ ์ ํ๋ ๊ณผ์ ์ด๋ค.
์ด๊ธฐํ: ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ฒ์์ผ๋ก ๊ฐ์ ์ ์ฅํ๋ ํ์
์ด๊ธฐํ ๋จ๊ณ์์๋ ์ ์ธ ํค์๋๋ฅผ ํตํด ์ด๋ฆ์ด ์ ํด์ง ๋ณ์์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ , ์๋ฌต์ ์ผ๋ก undefined๋ฅผ ํ ๋นํ๋ค.
์ด๊ธฐํ ๋จ๊ณ๋ ์ด๋ ์ ์ธ ํค์๋๋ฅผ ์ฌ์ฉํ๋๋์ ๋ฐ๋ผ ๋ค๋ฅธ๋ฐ,
var
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์ธ ๋ฐฉ์์ ๊ฒฝ์ฐ,
1. ์คํ ๋จ๊ณ์์ ์คํ ์ปจํ
์คํธ์ ๋ณ์๋ฅผ ๋ฑ๋กํ๋ค.
2. ์ฝ ์คํ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ ๊ณต๊ฐ์ ํด๋น ๋ณ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ค.
3. ๊ทธ ๊ณต๊ฐ์ ์ฃผ์๊ฐ์ ์คํ ์ปจํ
์คํธ์ ๋ฑ๋ก๋ ๋ณ์์ ์ ์ฅํ๋ค.
4. ํด๋น ์ ์ฅ ๊ณต๊ฐ์ undefined๋ฅผ ํ ๋นํ๋ ๊ฒ์ผ๋ก ์ด๊ธฐํ๋ฅผ ์งํํ๋ค.
var
ํค์๋์ ๊ฒฝ์ฐ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ํจ๊ป ์ผ์ด๋๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ณ ์๋ ๋ณ์๋ก ๊ฐ์ฃผ๋์ด ์ ์ธ๋ฌธ ์์์๋ ํด๋น ๋ณ์๋ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํด์ง var๋ก ์ ์ธ๋ ๋ณ์๋ ์คํ ์ปจํ
์คํธ ์ต์์๋ก ์ด๋ํ๊ฒ ๋๊ณ , var ํค์๋๋ก ์ ์ธํ ๋ณ์๊ฐ ํธ์ด์คํ
์ด ์ผ์ด๋๋ ๊ณผ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
const์ let ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์ธ๋ฐฉ์์ ๊ฒฝ์ฐ, ์คํ ๋จ๊ณ์์ ์คํ ์ปจํ ์คํธ์ ๋ณ์๋ฅผ ๋ฑ๋กํ๋ ์ ์ธ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ณ ๋ ํ ํด๋น๊ณผ์ ์์๋ ์๋ฌด๋ฐ ์์ ์ด ์ผ์ด๋์ง ์๋๋ค.
var C = "cheese"//์ ์ญ ์ ์ธ์ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ์ผ๋ก ๋ฑ๋ก ๊ฐ๋ฅ
function sayHi(){
if(true){
var C = "cherry"
var C = "candy" // ์ฌ์ ์ธ ๊ฐ๋ฅ
console.log(C) //candy
C = "cotton" // ์ฌํ ๋น ๊ฐ๋ฅ
}
console.log(C)//cotton
}
console.log(C)//cheese
let D = "diamond"
function sayHi(){
if(true){
let C = "cherry"
C = "candy" // ์ฌํ ๋น๋ง ๊ฐ๋ฅ(์ฌ์ ์ธ ๋ถ๊ฐ๋ฅ)
console.log(C) //candy
C = "cotton"
} // ์ด ์ฝ๋๋ธ๋ก ๋์ด๊ฐ๋ฉด์๋ถํฐ ๋ณ์ C ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
console.log(C) // sayHi()ํ๋ฉด Uncaught ReferenceError
}
console.log(C) // sayHi()ํ๋ฉด Uncaught ReferenceError
sayHi()
console.log(window.D) // undefined
const F = "friend"
F = "flower" // ์ฌํ ๋น์กฐ์ฐจ ๋ถ๊ฐ๋ฅ: Uncaught TypeError: Assignment to constant variable.
for (var i = 1; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, i * 1000);
}
์ด ์ฝ๋๋ 5 ๋ง 4๋ฒ ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
์ ๊ทธ๋ด๊น?
์ด๊ฑด ํด๋ก์
๋ผ๋ ๊ฐ๋
๋ ํจ๊ป ๊ณต๋ถํ๋ฉด ์ดํดํ ์ ์์ ๊ฒ ๊ฐ๋ค.
var
์ variable, const
๋ constant์์ ์๋๋ฐ let
์ ๋์ฒด ์ด๋์ ์๋๋ ์ด๋ค ์ด์ ์ง๋ฌธ. ์๊ฐํด๋ณด๋๊น ๊ฐ์๊ธฐ ๋๋ ๊ถ๊ธํด์ก๋ค.
๊ทธ์ ๋ํ ๋ต๋ณ
์ด ๋ถ์ ํฌํจํด ๋ค๋ฅธ ๋ต๋ณ๋ค๋ ์์ ๋ค๋ง์ ์ถ์ธก์ ์จ๋์๋๋ฐ, ์ด๊ฒ ๊ฐ์ฅ ๊ทธ๋ด๋ฏํ ์ด์ผ๊ธฐ์๋ค. ๊ทธ๋ฅ ์ํ์ ์ ํต์ ๋ฐ๋ผ, 'x๋ฅผ ์์์ ์ค์๋ผ๊ณ ํ์'๋ผ๊ณ ํ๋ ๊ฒ์ฒ๋ผ.
let์ ์ด๋์ ์์๊น ์คํ์ค๋ฒํ๋ก์ฐ ์ง๋ฌธ๋งํฌ
์ค๋ ๊ณต๋ถ ์ฐธ๊ณ ์ฌ์ดํธ: