์ด๋ฒ 3์ฃผ์ฐจ Weekly Paper ์์๋
- ์ด๋ฒ์ฃผ ๊ฐ์ ํ๊ธฐ ๋ฐ ์ค์ค๋ก์ ๋ํ ํผ๋๋ฐฑ
- var, let, const์ ๋น๊ต
- Lexical Scope์ ๊ฐ๋ ๊ณผ ๊ทธ ํน์ฑ
- JS์์์ this ํค์๋์ ์ฌ์ฉ ๋ฐ ํน์ฑ
์ ๋ค๋ฃน๋๋ค.
์๊ฐ๋ณด๋ค ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ๊ทธ๋ฅ ๋ฐฐ์ฐ๊ณ ๋๋ฉด ๋ญ๊ฐ ์ฌ๋ฐ๋ค
๊ทธ๋ฅ ๊ณ์ ์๊ฐํด๋ณด๋๊ฒ๋ ๊ทธ๋ ๊ณ
๋ชจ๋ฅด๋๊ฑฐ ์ฐพ์๋ณด๋๊ฒ๋ ๊ทธ๋ ๊ณ
ํ์๋ค๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋๋ฅผ ๋น๊ตํด๋ณด์๋
์๋ก์ ๋ก์ง์ด๋ ์๊ฐํ๋ ๋ฐฉํฅ, ์ชผ๊ฐ๋์๊ฒ์ด ๋ชจ๋ ๋ค๋ฅด๋ค
๋น๊ตํด๋ณด๋ฉด ์~ ์ด๋ ๊ฒ ํ๋๊ฑฐ๋ ๋๋๊ตฌ๋, ์ถ์๊ฒ ์ฐธ ์ ๊ธฐํ๋ค
๊ทผ๋ฐ ๋์ฒด๋ก ๋ด๊ฐ ํด๋์๋ฐฉ์์ ์ข ์ฃผ๋จน๊ตฌ๊ตฌ์์ด๋ผ
์ข.. ๊น๋ํ๊ฒ ํด์ผํ์ง์์๊น? ์ถ๊ธฐ๋ ํ๋ค ใ
ใ
..
์ด๋ฒ์ฃผ์ ์งํํ๊ฒ์ ๋ฐ์ํ ์น ๊ตฌํํ๊ธฐ์
ํ์๊ฐ์
, ๋ก๊ทธ์ธ ๋ก์ง ๊ตฌํํ๊ธฐ (์ด๋ฉ์ผ ์ ํจ์ฑ๊ฒ์ฌ, ๋น๋ฐ๋ฒํธ ๊ฒ์ฌ ๋ฑ๋ฑ..)
๊ทธ๋ฆฌ๊ณ ํ ๊ธํ์์ ๋น๋ฐ๋ฒํธ ๋ณด์ด๊ธฐ/์จ๊ธฐ๊ธฐ ๊ตฌํํ๊ธฐ
ํ์๊ฐ์
์ ํ ๋ค, ๊ทธ๋๋ก ์ถ๊ฐ๋ ๋ฐฐ์ด์
์ ์งํ๋๊ฑฐ๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง ์จ์ ๊ตฌํํด์ผํ๋๋ฐ
์ด๊ฒ ํ๊ฐ๋์์ ์๋๊ณ ์์ง ํ์ง๋ ์์์, ๋ค๋ฅธ๊ณณ์ผ๋ก ๋์ด๊ฐ๋ฉด ๋ฐฐ์ด ์ด๊ธฐํ๋๋ค..
์ฌ๋ฐ๊ธด.. ํ์!
JS๊ฐ ํ์ํ ์๊ฐ๋ถํฐ ์์๋ ์ ์๊น์ ๋ณ์ ์ ์ธ๋ฐฉ์.
์ฌ์ ์ธ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ง์์ ์ผ๋ก ์
๋ฐ์ดํธ ๋ ์ ์๋ค.
var๋ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ์ ์ถ๊ฐํ๋ฉฐ
"ํจ์์ค์ฝํ"์ด๋ค.
ํธ์ด์คํ ์ด ๊ฐ๋ฅํ๊ณ , "undefined"๋ก ์ด๊ธฐํ๋๋ค. (ํธ์ด์คํ ์ ๋ฐ๋ก ๋ค๋ฃฌ๋ค)
ํ์ง๋ง,
์ฌ์ ์ธ ๋ฐ ์ง์์ ์ธ ์
๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ ์ ๋ฐ๋ผ์ค๋ ๋ฌธ์ ์ ์ด ์๋๋ฐ,
var A = "A";
var X = 10;
if (X > 9) {
var A = "B";
}
console.log(A) // if๋ฌธ ๋ด์์ ์
๋ฐ์ดํธ๋ "B"๊ฐ ์ถ๋ ฅ๋๋ค.
์์ ์์์ฒ๋ผ
X๋ 9๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ True๊ฐ ๋ฐํ๋๊ณ
๊ทธ์๋ฐ๋ผ์ A๋ "B"๋ก ์ฌ์ ์๋๋ค.
ํจ์ ๋ด๋ถ์ A๋ฅผ "B"๋ก ์ฌ์ ์ํ๋๊ฒ์ด ์๋์ ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด ์๊ด์ด ์์ง๋ง
๋ณ์ A๋ฅผ "A"๋ผ๊ณ ์ ์ํ๋ค๋๊ฒ์ ์๊ณ ์์ง ๋ชปํ๋ค๋ฉด,
๋ค๋ฅธ ๋ณ์ A๋ฅผ ๋ค๋ฃจ๋ ์ฝ๋์์ ์๊ฐ์ง ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
function Var() {
if (true) {
var x = 10;
}
console.log(x); // 10์ด ์ถ๋ ฅ๋๋ค (ํจ์ ์ค์ฝํ)
}
Var();
ECMAScript 6์์ ์ถ๊ฐ๋ ๋ณ์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก
์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๊ณ , ์ง์์ ์ผ๋ก ์
๋ฐ์ดํธ ๋ ์ ์๋ค..
var๊ณผ ๋ค๋ฅด๊ฒ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ์ ์ถ๊ฐํ์ง ์๊ณ
"๋ธ๋ก ์ค์ฝํ" ์ด๋ค.
ํธ์ด์คํ ์ด ๊ฐ๋ฅํ๊ณ ์ด๊ธฐํ๋์ง ์๋๋ค.
let์ด ์ ์ธ๋ ๋๋ ๋ธ๋ก ๋ฒ์๋ก ์ง์ ๋๋ค.
์ฆ, ํด๋น ๋ธ๋ก ๋ด์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
let A = "A";
if (true) {
let A = "B";
console.log(A); // "B"๊ฐ ์ถ๋ ฅ๋๋ค.
}
console.log(A); // "A"๊ฐ ์ถ๋ ฅ๋๋ค.
A๋ฅผ "B"๋ก ์ฌ์ ์ํ์๋,
๋ณ์ A์ ๋ฒ์๋ ๋ธ๋ก์ผ๋ก ํ์ ๋๊ธฐ ๋๋ฌธ์
๋ธ๋ก ๋ด๋ถ์์๋ B๋ก "์
๋ฐ์ดํธ" ๋ ์ํ๋ก ์ถ๋ ฅ๋๊ธฐ๋๋ฌธ์ B๊ฐ ์ถ๋ ฅ๋์ง๋ง.
๋ธ๋ก ๋ฐ์์๋ ๋ณ์ A๋ ๋ค์ A๋ก ๋์์ค๋๊ฑธ ๋ณผ ์ ์๋ค.
์ฌ์ค์ ๋ค๋ฅธ ๋ณ์๋ก ์ทจ๊ธ๋๋๊ฒ.
ํ์ง๋ง
let A = "A";
A = "B"; //A๋ ์ด๋ฏธ ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํจ.
์์ ์์์ฒ๋ผ ๋์ผ ๋ฒ์ ๋ด์์ ์ฌ์ ์ธ ์ ๋ถ๊ฐ๋ฅํ๋ค.
๊ฐ๋จ ์์
function Let() {
if (true) {
let y = 10;
}
console.log(y); // ์ฐธ์กฐ์ค๋ฅ๊ฐ ์ผ์ด๋๋ค (Y๊ฐ ์ ์๋์ด ์์ง ์์)
}
Let();
๋ฒ์์์ฒด๊ฐ "๋ธ๋ก ์ค์ฝํ" ์ด๋ค ๋ณด๋
๊ฐ์ ํจ์ ๋ด์ ์์ง๋ง, ๋ค๋ฅธ ๋ธ๋ก์์๋ ์ฐธ์กฐ๋ฅผ ํ ์ ์๋๊ฒ์ ๋ณผ ์ ์๋ค.
ECMAScript 6์์ ์ถ๊ฐ๋ ๋ณ์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก
์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๊ณ , ์ง์์ ์ผ๋ก ์
๋ฐ์ดํธ ํ ์ ์๋ค.
var๊ณผ ๋ค๋ฅด๊ฒ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ์ ์ถ๊ฐํ์ง ์๊ณ
"๋ธ๋ก ์ค์ฝํ" ์ด๋ค.
ํธ์ด์คํ ์ด ๊ฐ๋ฅํ๊ณ ์ด๊ธฐํ๋์ง ์๋๋ค.
let๊ณผ ๋์ผํ๊ฒ ๋ธ๋ก์ค์ฝํ์ด๊ณ , ์ฌ์ ์ธ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ๊น์ง ๋๊ฐ์ง๋ง
let๊ณผ๋ ๋ค๋ฅด๊ฒ ์
๋ฐ์ดํธ๋ ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ์ ๋ชจ๋ const๋ ์ ์ธ๋น์ ์ด๊ธฐํ ๋์ด ์์ด์ผ ํ๋ค.
ํ์ง๋ง, ๊ฐ์ฒด๋ ์กฐ๊ธ ๋ค๋ฅธ ์ ์ด ์๋๋ฐ
const Kim = {
name: "HyunU",
age: 21
}
์ด๋ฐ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด
const Kim = {
gender: "Male",
Year: 1
} // ์์๋ณ์์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํจ
์์ฒ๋ผ ๋ณ์ Kim ์์ฒด์ ๊ฐ์ฒด๋ฅผ ์ฌํ ๋นํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง๋ง
Kim.gender = "Male";
Kim.Year = 1;
์ด๋ฌํ ํํ๋ก
const๋ก ์ ์ธํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
๊ฐ๋จ ์์
function Const() {
const z = 30;
z = 40; // ์์๋ณ์์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํจ
}
Const();
ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ์์ผ๋ก ์์์๋ถํฐ ์๋๋ก ์งํ๋๋ค.
ํ์ง๋ง ๋ณ์๋ ํจ์๊ฐ์ ์น๊ตฌ๋ค์ ๋ค๋ฅด๋ค.
"hoisting"
๋ง ๊ทธ๋๋ก ๋์ด์ฌ๋ ค์ง๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
ํน์ ์ค์ฝํ ์์ ์ด๋์์๋ ๋ณ์์ ์ธ์ ์ต์์์์ ์ ์ธ๋ ๊ฒ๊ณผ ๊ฐ์๊ฒ.
๊ทธ๋ ๋ค๋ฉด ๋จ์ํ "var A = A"๋ผ๋ ๊ตฌ๋ฌธ์ด ์์๋,
๋์ด์ฌ๋ ค์ก๋ค๋ฉด
console.log(A) // undefined
var A = A
์ด๊ฑฐ๋ undefined๊ฐ ์๋๊ณ A๊ฐ ์ถ๋ ฅ๋์ด์ผํ๋๊ฑฐ ์๋๊ฐ?
์๋์์ ํ์ธํด๋ณด์.
"๋์ด์ฌ๋ ค ์ง๋ค" ๋ผ๋ ๊ฒ์
var x = '๋ฐ๊นฅ์ชฝ์ ์ค์ฝํ';
(function() {
console.log(x); // undefined
var x = '์์ชฝ์ ์ค์ฝํ';
}());
์ด๋ฐ ์ฝ๋๋ ์ฌ์ค
var x = '๋ฐ๊นฅ์ชฝ์ ์ค์ฝํ';
(function() {
var x;
console.log(x); // undefined
var x = '์์ชฝ์ ์ค์ฝํ';
}());
์ด ์ฝ๋์ ๊ฐ๋ค๋ ์๋ฏธ๋ค.
์ฌ์ค ์์์ var๋ฅผ ๋ณด๊ณ ์์ผ๋ฉด
ํจ์ ๋ฐ์ x๊ฐ ์ค์ฝํ ๋ฐ์ด๋ ์ฐธ์กฐํ ์์๊ณ ,
ํจ์ ๋ด๋ถ์ x๋ํ ์์์ ๋งํ๋ฏ ์ด๊ธฐํ๋๋๊น
console.log(x)์ ์ถ๋ ฅ๊ฐ์ดundefined์ธ๊ฑฐ๋ ๋ฉ๋ํ ์ ์๊ฒ ๋ค.
๋ํ, ๋ณ์๊ฐ ์ ์ธ๋๊ธฐ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋
A = "A";
var A;
// ์์ ์๋๋ ์๋ฏธ๊ฐ ๊ฐ๋ค.
var A;
A = "A";
์ด๋ฐํํ๋ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง
console.log(x); // ์ฐธ์กฐ์๋ฌ ๋ฐ์! (const๋ ๋์ผํ๋ค)
let x = 'X';
์ด ์ฝ๋๋ ์ด๋ค๊ฐ?
์๋, ์ฐธ์กฐ์๋ฌ ๋ฐ์?
๋ฐฉ๊ธ ํธ์ด์คํ
๋๋ค๊ณ ๋ค~ ์จ๋์ง์์๋?
์ฐธ์กฐ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ํธ์ด์คํ
์ด ์๋๋๊ฑฐ ์๋๊ฐ?
๋จ์ํ "๋์ด์ฌ๋ฆฐ๋ค" ๋ผ๊ณ ๋งํ๋ค๋ฉด ์คํด๋ฅผ ํ ์ ์๋๊ฒ
var A = A ๋ผ๋ ์ ์ธ๊ณผ ๋์์ ๋์
๋๋ ๋ถ๋ถ์ด ์๋ค๋ฉด
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ทธ๋ ๊ฒ ๋ณด์ง ์๋๋ค.
var A์ A = A๋ผ๋ ๊ตฌ๋ฌธ์ผ๋ก ๋ฐ๋ก๋ฐ๋ก ๋ณด๊ณ
์ฒซ๋ฒ์งธ๋ ์ปดํ์ผ๋ฌ ๋จ๊ณ์์ ์ฒ๋ฆฌํ๊ณ
๋ ๋ฒ์งธ ๊ตฌ๋ฌธ์ ์คํ ๋จ๊ณ์์ ์ฒ๋ฆฌํ๋ค.
์ด๊ฒ์ ์ค์ฝํ์ ๋ชจ๋ "์ ์ธ๋ฌธ"๋ค์ ์คํ ์ ์ ๋จผ์ ์ฒ๋ฆฌ๋๋ค๋ ์ ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, let๊ณผ const๋ ์ด์งธ์ var๊ณผ ๋ค๋ฅธ๊ฒ์ธ๊ฐ?
์กฐ~๊ธ ๋ณต์กํด์ง๋๋ฐ ๊ณ์ ๊ฐ๋ณด์.
์คํ ์ปจํ ์คํธ๋ "์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด" ์ด๋ค.
์คํ ์ปจํ
์คํธ๋
๋์ผํ ํ๊ฒฝ์ ์๋ ์ฝ๋๋ค์ ์คํํ ๋
ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑ์ํค๊ณ .
์ด๊ฒ๋ค์ Call stack
(ํ์ฌ ์ด๋ค ํจ์๊ฐ ์คํ์ค์ธ์ง, ๊ทธ ํจ์ ๋ด์์ ์ด๋ค ํจ์๊ฐ ํธ์ถ๋์ด์ผ ํ๋์ง, ๋ฑ์ ์ ์ดํ๋๊ณณ)์ ์ญ์ญ์ญ ์์์ฌ๋ ธ๋ค๊ฐ
๊ฐ์ฅ ์์ ์์ฌ์๋ ์ปจํ
์คํธ์ ๊ด๋ จ ์๋ ์ฝ๋๋ค์
์์ฐจ์ ์ผ๋ก ์คํํ๋ ์์ผ๋ก ์ ์ฒด ์ฝ๋์ ํ๊ฒฝ๊ณผ ์์๋ฅผ ๋ณด์ฅํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๋ ์๊ฐ ์ ์ญ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์ ๋ด๊ธด๋ค.
(๊ทธ๋ฅ ํจ์ ๋ด์ ์๋ ์ฝ๋๋ ๋ชจ๋ ์ ์ญ ์ปจํ
์คํธ ์์ ์๋ค.)
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ผ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ ๋๋ง๋ค ๊ธ๋ก๋ฒ ์คํ ์ปจํ ์คํธ(Global Execution Context)๋ฅผ ์์ฑํ๋ค.
์ ์ญ ์ปจํ ์คํธ๋ ๋ฑํ ์ฝ๋์์ ์คํ๋ช ๋ น์ ํ์ง ์์๋
์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์ด๋ฆฌ๋ ์๊ฐ
์ ์ญ ์ปจํ
์คํธ๊ฐ ํ์ฑํ๋๊ณ ์ฝ์คํ์ ๋ด๊ธด๋ค๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ์๋ window ๊ฐ์ฒด๊ฐ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ๋๋ค.
(์ฌ์ง์ ์ฐธ๊ณ ํ๋ฉฐ ์ฝ์ด๋ณด์)
์ด์ ์ฝ ์คํ์์ ์ ์ญ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ค๊ฐ
์ฌ์ง์ one ํจ์๋ฅผ ํธ์ถํ๋ฉด JS์์ง์
one ํจ์์ ๋ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ์์งํด์
one ์คํ ์ปจํ
์คํธ๋ฅผ ๋ง๋ค์ด Call stack์ ์๋๋ค.
๊ทธ๋ฌ๋ฉด Call stack์ ๋งจ ์์ one ์คํ ์ปจํ
์คํธ๊ฐ ๋์์ผ๋,
์ ์ญ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ์ ์ค์งํ๊ณ
one ์คํ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ธ one ํจ์ ๋ด๋ถ์ ์ฝ๋๋ค์ ์์ฐจ๋ก ์คํํ๋ค.
๊ทธ๋ฆฌ๊ณ two ํจ์ํธ์ถ์ ๋ง๋์, ๋ค์ ์๊ณ ๋์
๊ทธ ์์์ ๋๋ค์ three ํจ์ํธ์ถ์ ๋ง๋๊ณ
์คํ ์ปจํ
์คํธ๊ฐ ์คํ์ ๊ฐ์ฅ ์์ ๋ด๊ธฐ๋ฉด
์ด์ ๋ one์คํ ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋์ ์คํ์ ์ค๋จํ๊ณ
three ํจ์ ๋ด๋ถ์ ์ฝ๋๋ฅผ ์์๋๋ก ์งํํ๋ค.
์ฝ๋๊ฐ ๋ชจ๋ ๋์ด three ํจ์์ ์คํ์ด ์ข
๋ฃ๋๋ฉด three ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋๊ณ ,
๊ทธ๋ฌ๋ฉด two ์คํ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์ ๋งจ ์์ ์กด์ฌํ๊ฒ ๋๋ฏ๋ก
์ค๋จํ๋ ๋ถ๋ถ(three๋ฅผ ๋ง๋๋ถ๋ถ)๋ถํฐ ์ด์ด์ ์คํํ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ค ์คํ ์ปจํ
์คํธ๊ฐ ํ์ฑํ๋๋ ์์ ์(์ฝ์คํ์ ๋งจ ์์ ์์ด๋ ์๊ฐ์)
JS์์ง์ ํด๋น ์ปจํ
์คํธ์ ๊ด๋ จ๋ ์ฝ๋๋ค์ ์คํํ๋ ๋ฐ
ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ค์ ์์งํด์ ์คํ ์ปจํ
์คํธ ๊ฐ์ฒด์ ์ ์ฅํ๋ค.
์คํ ์ปจํ
์คํธ๋ฅผ ๊ตฌ์ฑํ๋ฉฐ ์๊ฒจ๋๋ ๊ฒ๋ค๋ก๋
Lexical Environment
VariableEnvironment
This.binding์ด ์๊ณ .
์ดํ์ ํ๊ฒฝ(Lexical enviroment)์ด๋
ํจ์, ๋ณ์๊ฐ ์ ์ธ๋์ ๋์ ์ค์ฝํ๋ฅผ ์๋ฏธํ๋ค
์ ์ธ ๋น์์ ํ๊ฒฝ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด์ด๋ค. ์ฆ, ๊ตฌ์ฑ ํ๊ฒฝ์ด๋ค.
์ฒ์์๋ VariableEnvironment์ ๊ฐ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๋ค
์คํ ์ปจํ
์คํธ ๋ด์ ์ดํ ํ๊ฒฝ์ ์ผ๋ถ๋ก์,
๋ณธ์ง์ ์ผ๋ก ํ์ฌ ๋งฅ๋ฝ ๋ด์์ ์ ์ธ๋ ๋ณ์์ ๊ธฐ๋ฅ(์๋ณ์)์ ๋ถ๊ณผํ๋ค.
์ธ๋ถ ํ๊ฒฝ ์ ๋ณด
์ ์ธ ์์ ์ LexicalEnvironment์ "์ค๋
์ท" ์ผ๋ก
๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์๋์ง ์๋๋ค.
์๋์์ ์ถ๊ฐ๋ก this ํค์๋์ ๋ํด ๋ค๋ฃฐ๊ฒ์ด๋ค.
์ด์ LexicalEnvironment์ ๊ตฌ์ฑ์์๋ฅผ ๋ค๋ฃจ๋ฉฐ
ํธ์ด์คํ
์ ์์๋ณด์.
JS๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ด์ , ๋ฏธ๋ฆฌ ๋ชจ๋ ์๋ณ์๋ค์ ์์งํด๋๋ค.
๊ทผ๋ฐ ์์์๋ ๋งํ๋ฏ, ๋ณ์๋ฅผ ์ธ์ํ ๋ ์๋ณ์๋ง ๋์ด์ฌ๋ฆฌ๊ณ ํ ๋น ๊ณผ์ ์ ์๋ ์๋ฆฌ์ ์์๋๋ก ๋จ๊ฒจ๋๋ค.
์ฌ๊ธฐ์ ํธ์ด์คํ
์ ๊ฐ๋
์ด ๋์ค๋๋ฐ
ํธ์ด์คํ
์ ๋จ์ํ ์ฝ๋ ํด์์ ์ข ๋ ์์ํ๊ฒ ํ๊ธฐ ์ํด
environmentRecord์ ์์ง ๊ณผ์ ์ ์ถ์ํํ ๊ฐ๋
์ผ๋ก
์ต์๋จ์ผ๋ก ์ด ์๋ณ์๋ค์ '๋์ด์ฌ๋ฆฐ๋ค'๊ณ ํด์ํ๋ ๊ฒ์ด๋ค.
์ธ๋ถ ๋ ์์ปฌ ์ฐธ์กฐ์๋
"ํจ์๊ฐ ์ํ ์ค๋ธ์ ํธ"์ ์๋ ๋ณ์์ ํจ์๊ฐ ์ ์ฅ๋๋ค.
์ฝ๋๋ฅผ ์คํํ ๋ ํ์ํ ๋ณ์๋ฅผ
ํด๋น ๋ก์ปฌ ์ค์ฝํ์ ์ฐ๊ด๋ผ ์๋ ํ๊ฒฝ ๋ ์ฝ๋์์ ๋จผ์ ์ฐพ๊ณ ,
๊ทธ ์์ ์์ผ๋ฉด ๋ ์์ปฌ ํ๊ฒฝ์ด ๊ฐ๊ณ ์๋
์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๋ก ์ ๊ทผํด์
๊ทธ ์ธ๋ถ ํ๊ฒฝ ๋ ์ฝ๋์ ์๋์ง ๋ ์ฐพ๋๋ค.
๊ทธ๋๊น ์ด๋ฐ ๊ณผ์ ์ผ๋ก
์๋ณ์์ ์ ํจ๋ฒ์๋ฅผ ์์์ ๋ฐ๊นฅ์ผ๋ก ์ฐจ๋ก๋ก
๊ฒ์ํด๋๋ ๊ฒ์ด "์ค์ฝํ์ฒด์ธ" ์ธ๊ฒ
์ด๊ฒ ๊ฐ๋ฅํ๊ฒ ํ๋๊ฒ์ด ๋ฐ๋ก ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ ์ธ๊ฒ์ด๊ณ
์ด๋ฐ ํํ๋ก ์ ์ญ๊น์ง ํ๊ณ ๊ฐ์ ์๋ณ์๋ฅผ ๊ฒ์ํ๊ณ ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์์์ ๋งํ๋ฏ
์ด๋ ๊ฒ var์ const, let์ผ๋ก ์ ์ธํ ๋ณ์์ ์ค์ฝํ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
ํ ํจ์ ์์ ์ฌ๋ฌ๊ฐ์ ๋ธ๋ก ์ค์ฝํ๊ฐ ์กด์ฌํ ๋, ๊ฐ ๋ธ๋ก ์ค์ฝํ ๋ณ๋ก ๋ ์์ปฌ ํ๊ฒฝ๊ณผ Lexical Environment ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ํ์๊ฐ ์๋๊ฑฐ๊ณ
๋ฐ๋ฉด ํจ์ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋ var ๋ณ์์ ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์๋ ํจ์๋ ์ฒ์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋ ๋ Variable Environment์ ์ ์ฅ๋์ด ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ ํธ์ด์คํ ์ ๊ณผ์ ๋ํ ์ค๋ช ์ธ๊ฒ์ด๊ณ
์ด์ ์ ๋๋ก var,let,const์ ์ฐจ์ด๋ฅผ ์์๋ณด์!
๋ณ์ ์์ฒด๋ ์ดํ์ ํ๊ฒฝ์ ํฌํจ๋ ๋ ์์ฑ๋์ง๋ง
์ดํ์ ๋ฐ์ธ๋ฉ(ํ๋ก๊ทธ๋จ์์ ๋ณ์๋ค์ด ๊ฐ๋ ์์ฑ์ด๋ ๊ฐ์ด ๊ฒฐ์ ๋๋ ๊ฒ)๊น์ง ํ๊ฒฝ๋ ์ฝ๋์ ์ ์ฅํ๊ธฐ ์ ๊น์ง๋ ์คํ๋๊ธฐ ์ ๊น์ง๋ ์ก์ธ์คํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ด์ var, const, let์ ์ฐจ์ด๊ฐ ๋์จ๋ค.
JS์์์ ๋ณ์๋
์ ์ธ, ์ด๊ธฐํ, ํ ๋น์ด๋ผ๋ 3๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑธ์ณ์ ์์ฑ๋๋๋ฐ
var ๋ ๋ณ์ ์ ์ธ์ ์ ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๋ฅผ ๋์์ ์งํํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ ์ ์ ํธ์ถ์ ํด๋
ํ๊ฒฝ๋ ์ฝ๋์ ์๋ณ์ ์์ง๊ณผ์ ์์ ํ ๋น์๋ ๋จ์์์ด๋
undefined๋ก ํธ์ถ์ด ๋๋ ํธ์ด์คํ
์ด ๋ฐ์ํ๋ ๊ฒ!
ํ์ง๋ง
let,const ์ผ๋ก ์ ์ธ๋ ๋ณ์๋ var ํค์๋์๋ ๋ค๋ฅด๊ฒ
์ ์ธ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋ถ๋ฆฌ๋์ด์ ์งํ์ด ๋๋ค
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๊ฒฝ๋ ์ฝ๋์ ์๋ณ์ ์์ง๊ณผ์ ์์ ๋ณ์๋ฅผ ๋ฑ๋กํ์ง๋ง
(์ด๋ฏธ ํธ์ด์คํ
์ ๋์ด์์ง๋ง),
ํ ๋น์ด ๋์ง ์์(์ด๊ธฐํ๊ณผ์ ์ด ์์ง ์งํ๋์ง ์์์) ์ ๊ทผํ ์ ์์ด
์ฐธ์กฐ ์๋ฌ(ReferenceError)๊ฐ ๋ฐ์ํ๋ ๊ฒ ์ด๊ณ ,
๊ทธ๋์ ํธ์ด์คํ
์์ ๋์ค๋ TDZ๋
TDZ๋ ํด๋น ์ค์ฝํ์ ์์ ์ง์ (๋ณ์ ๋ฑ๋ก์์ )๋ถํฐ
์ด๊ธฐํ ์์ ์๊ฐ๊น์ง์ ๊ตฌ๊ฐ์ ๋งํ๋๊ฒ์ด๋ค.
๊ฐ๋จํ, ์์์ ๋งํ Lexical Environment๋
๋ ์์ปฌ ์ค์ฝํ์ ์ค์ฒด์ด๋ค. ์ด๋ป๊ฒ ๊ตด๋ฌ๊ฐ๋์ง๋ ๋ชจ๋ ์์์ผ๋
์ดํดํ๊ธฐ๊ฐ ์ฝ๋ค!
๋ ์์ปฌ ์ค์ฝํ๋
ํจ์๋ฅผ ์ด๋์ "ํธ์ถ"ํ๋์ง๊ฐ ์๋๋ผ ์ด๋์ "์ ์ธ"ํ์๋์ง์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ ๊ฒ์ ๋งํ๋ค.
์ฌ์ค ์๊ฐํด๋ณด๋ฉด ๊ฐ๋จํ๋ค
์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ญ์ง
์ค์ฝํ์ฒด์ธ์ด ๋ฌด์์ธ์ง
์์์ ๋ค ์๊ฐํด๋ณด์ง ์์๋๊ฐ
์๋์ ์์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์ํ ์ง ์๊ฐํด๋ณด์.
var x = 1; // global
function A() {
var x = 10;
B();
}
function B() {
console.log(x);
}
A(); // ?
B(); // ?
ํด๋น ์ฝ๋๋ ์คํ๊ณผ์ ์์ ๋ชจ๋ ๋ณ์๋ค์ ์ค์ฝํ๊ฐ ์ ํด์ง๋ค.
์ ์ญ์ ๋ณ์ x
function A์ ๋ณ์ x
function B์ ๋ณ์ x
function B์ ๋ณ์ x๋ fucntion B
์์ x๋ฅผ ์ฐพ์๋ค -> ์ ์ญ์ผ๋ก ์ฌ๋ผ๊ฐ๊ฒ์ด๊ณ ์ ์ญ์์ x = 1
์ ์ฐพ์ ์๊ฐ
๊ทธ์๊ฐ๋ถํฐ function B
์ console.log(x)๋ 1์ ๋ฑ๊ธฐ๋ก ์ ํด์ ธ์์ผ๋
ํด๋น ํจ์์ ํธ์ถ์์น๊ฐ ์ ์ญ์ด๋ , function A๋ ์๊ด์์ด
console.log(x)๋ 1์ ๋ฑ๋๊ฒ์ด๋ค
๋ฐ๋ผ์ fucntion A์ B๋ ๋๋ค 1์ ๋ฑ๋๋ค.
this ํค์๋๋ผ๋๊ฒ์
์ง๊ธ์ ์คํ ์ปจํ
์คํธ๋ฅผ ์ฐธ์กฐํ๋ ํน๋ณํ ํค์๋์ด๋ค.
ํ์ด์ ์ด์ผ๊ธฐํ๋ค๋ฉด.
this binding์
ํธ์ถ๋๋ ์์น์ ํธ์ถ๋ ์์ ์
์คํ ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ณ์๊ฐ ์ฐธ์กฐ๋๋ ๋ฒ์๋ฅผ ๊ฒฐ์ ํ๋ ๊ณผ์
์ ๋ฐ๋ฅด๋
์์ ์ค๋ช
ํ lexical scope์ ๋ฐ๋๋๋ ๊ฐ๋
์ธ
dynamic scope๊ฐ๋
์ ์ฌ์ฉํ๋ค๊ณ ํ ์ ์๊ฒ ๋ค.
๋ ์์ปฌ ์ค์ฝํ๊ฐ
"์ ์ธ์ ์์น"๊ฐ ์ด๋ค ๋ณ์๋ฅผ ์ฐธ์กฐํ๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค๋ฉด
๋์ ์ค์ฝํ๋
"ํธ์ถ์ ์์น"๊ฐ ์ด๋ค ๋ณ์๋ฅผ ์ฐธ์กฐํ๋์ง๋ฅผ ๊ฒฐ์ ํ๋๊ฒ.
๊ทธ๋ ๋ค๋ฉด ์ด์ this ํค์๋์ ์ญํ ์ ์ดํด๋ณด์!
์ ์ญ ์ฝ๋์์ this๋ ์ ์ญ ๊ฐ์ฒด(global object)๋ฅผ ์ฐธ์กฐํ๋ค.
๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ window ๊ฐ์ฒด๋ฅผ
Node.js ํ๊ฒฝ์์๋ global ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
console.log(this); // ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ด๋ผ๋ฉด window
๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ๋ด๋ถ์์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
๊ทธ๋ฌ๋ ํจ์ ํธ์ถ ๋ฐฉ์์ ๋ฐ๋ผ this์ ๊ฐ์ ๋ฌ๋ผ์ง ์ ์๋ค
(๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถํ๋ค๋์ง, newํค์๋๋ฅผ ์ด์ฉํด ์์ฑ์ ํจ์๋ก ํธ์ถํ๋ค๋์ง ๋ฑ)
//์ผ๋ฐํจ์๋ก ํธ์ถ๋์๋ค.
function foo() {
console.log(this);
}
foo(); // ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ด๋ผ๋ฉด window, strict mode๋ผ๋ฉด undefined๋ก ์ง์ ๋๋ค.
//๋ฉ์๋๋ก ํธ์ถ๋์๋ค
const obj = {
name: "Kim",
getName: function() {
console.log(this.name);
}
};
obj.getName(); // Kim [๊ฐ์ฒด์ ๋ฉ์๋๋ก ํธ์ถ๋์ด ํด๋น๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค]
function Person(name) {
this.name = name;
}
const person = new Person('Kim');
console.log(person.name); // Kim [์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ์๋ค]
์ธ์๋ add, apply ๋ฉ์๋๋ก this๊ฐ ์ฐธ์กฐํ ๋์์
์ ํด์ค์๋์๊ณ ,
bind ๋ฉ์๋๋ก this๊ฐ ์๊ตฌ์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์๋์๋ค.
ํ์ง๋ง ํ์ดํํจ์์ ๊ฒฝ์ฐ๋
์ผ๋ฐ ํจ์์ Dynamic scope๊ฐ ์๋
Lexical Scope๋ฅผ ๋ฐ๋ฅด๋๋ก ์ค๊ณ๋์ด์๊ธฐ์
์์ ๋ง์ this๊ฐ ์๊ณ , ์์๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
์์๋ฅผ ๋ณด์.
const obj = {
value: 42,
regularFunction: function() {
console.log(this.value);
},
arrowFunction: () => {
console.log(this.value);
}
};
obj.regularFunction(); // 42 (obj๊ฐ this๋ก ๋ฐ์ธ๋ฉ๋จ)
obj.arrowFunction(); // undefined (์์ ์ค์ฝํ์ this๋ ์ ์ญ ๊ฐ์ฒด)
์ด๋ฐ์์ด๋ค.
๊ทธ๋ ๊ธฐ์ ํ์ดํํจ์๋ ์ผ๋ฐํจ์์ ๋ค๋ฅธ ์ด์ ์ด ์๋๋ฐ
function Timer() {
this.seconds = 0;
setInterval(() => {
this.seconds++;
console.log(this.seconds);
}, 1000);
}
const timer = new Timer();
// 1, 2, 3, ... (1์ด๋ง๋ค this.seconds๊ฐ ์ฆ๊ฐ)
์ ์์์์ setInterval์ ์ฝ๋ฐฑ ํจ์๋ก ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ์
์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์ this๋ Timer ๊ฐ์ฒด์ this๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๋๊ฒ์ด๊ณ .
๋ง์ฝ ์ผ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด,
setInterval์ this๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์ด
this.seconds๋ undefined์ด๊ณ , undefined++๋ NaN์ด ๋์์ ๊ฒ์ด๋ค.
์ด์ฒ๋ผ this ํค์๋๋ ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉ๋๋ฉฐ
thisํค์๋๋ฅผ ์ ์ดํดํ๋๊ฒ์
์ฝ๋๋ฅผ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ์งค์์๋๋ก ๋๋๋ค!
์ด์ฌํ ์ฐพ์๋ณด๋ฉด์ ๊ธ์ด๋ชจ์ ์ผ๋๋ฐ
๋๋ฌด ์ดํดํ๊ธฐ ์ด๋ ค์ ๋ค.
A๋ฅผ์ฐพ์ผ๋ฉด A์์ B๋ C๋ผ๋
์๋ก์ด ๊ฐ๋
์ด๋ผ ๋์ค๋์์ผ๋ก ๋ฌดํํ๊ฒ ์ด์ด์ง๋ ๋๋์ด๋ผ
์๋ฌด๋๋ ๋ณธ๋ฌธ์ ์ข ์๊ด์๋ ๋ด์ฉ๋ ๋ง์ด ๋ค์ด๊ฐ์์ง ์ถ๋ค.
์์ง๋ ์ ๋๋ก ์ดํดํ๊ฑด์ง ์๋ฆฌ๊น๋ฆฌํ๋ฐ,
์์ ํ ์ดํดํ๋ฉด ์ง์ง๋ก ์ดํดํ๊ธฐ ์ฝ๊ฒ ๊ธ์ ํ๋ฒ ์์ ํ ์๋ก ์จ์ผ์ง ์ถ๊ณ ..
๋ฏธ์ํฉ๋๋ค~
#์ฝ๋์์คํ๋ฆฐํธ #์คํ๋ฆฐํธํ์คํ1๊ธฐ #์ทจ์ ๊น์ง๋ฌ๋ฆฐ๋ค
์ด๋ฌํ ํํ๋ก
const๋ก ์ ์ธํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
์จ์ฃผ์ const๋ด์ฉ์ ์์๊ฐ์ ๋ด์ฉ์ด ์๋๋ฐ, ํน์ ์ด ์ด์ ๋ ์๊ณ ๊ณ์ ๊ฐ์?