์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ง์ด์, ๋ฌธ์ ์ธ ์ ์ญ ๋ณ์์ ๋ํด ์์๋ด ์๋ค.
์ ์ญ ๋ณ์๋ฅผ ๋จ์ฉํ๋ฉด ๋ง์ ๋ฌธ์ ์ ์ด ์๋ค๊ณ ํฉ๋๋ค. ๋ฌด์จ ์ด์ ์ผ๊น์?
๋ณ์๋ ์์ ์ด ์ ์ธ๋ ์์น์ ์์ฑ๋๊ณ ์๋ฉธํฉ๋๋ค. ์ด๋ฅผ ์๋ช ์ฃผ๊ธฐ(Life Cycle)๋ผ๊ณ ํด์.
์๋ฅผ ๋ค์ด๋ณผ๊น์? ์๋ ์์ ๋ let
, const
๊ฐ ์๋ var
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ช
ํฉ๋๋ค.
var x = '์ ์ญ';
function foo() {
var y = '์ง์ญ';
console.log(y); // ์ง์ญ
return y;
}
foo();
console.log(y); // undefined
ํจ์ ๋ด๋ถ์ ์ ์ธ๋ ์ง์ญ ๋ณ์(y
)๋ ํจ์ ํธ์ถ ์ ์์ฑ๋๊ณ ํจ์ ์ข
๋ฃ์ ํจ๊ป ์๋ฉธ(undefined
)ํฉ๋๋ค. ํ์ง๋ง ์ ์ญ ๋ณ์(x
)๋ ๋์ฒด ์ธ์ ์๋ฉธ, ์๋ ์์ฑ๋ ๊น์?
์ฐ๋ฆฌ๋ ํธ์ด์คํ
(Hoisting)์ ๋ํด ์ดํดํ๊ณ ์์ผ๋ ๋ณ์ ์ ์ธ์ ์ ์ธ๋ฌธ์ ์์น ์๊ด ์์ด ๊ฐ์ฅ ๋จผ์ ์คํ
๋จ์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ์ด์ ๋งํ๋ฉด ๋ฐํ์์ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ ์ด์ ๋จ๊ณ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ๋จผ์ ์คํ๋๋ ๊ฒ์ด๋ผ ํ ์ ์์ฃ . ๋จ, ์ด ์ค๋ช
์ ์ง์ญ ๋ณ์์ ํด๋นํ์ง ์๊ณ , ์ ์ญ ๋ณ์
์ ํด๋นํฉ๋๋ค. ์ง์ญ ๋ณ์๋ ์์์ ์ธ๊ธํ ๊ทธ๋๋ก ์คํ๋๊ฑฐ๋ ์! ๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์ด๋ ๊ฒ ๋๊ฒ ์ฃ ?
var x = '์ ์ญ'; // ์ ์ญ ๋ณ์ x ์์ฑ
function foo() {
// ์ง์ญ ๋ณ์ y ์์ฑ
var y = '์ง์ญ'; // ์ง์ญ ๋ณ์ y ๊ฐ ํ ๋น
console.log(y);
return y;
// ์ง์ญ ๋ณ์ y ์๋ฉธ
}
foo();
console.log(y); // undefined
// ์ ์ญ ๋ณ์ x ์ ํจ
์ด๋์๋ ์ ๊ทผํ๊ณ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด, ๊ทธ๊ฒ์ ๊ณผ์ฐ ์ข๊ธฐ๋ง ํ ๊น์?
์ด์ ๋ถํฐ ์ ์ญ ๋ณ์๊ฐ ๊ฐ์ง๋ ๋ฌธ์ ์ ๊ณผ ๊ทธ ์ด์ ๋ฅผ ํ๋์ฉ ์ดํด๋ด ๋๋ค.
-
์๋ฌต์ ๊ฒฐํฉ(Implicit Coupling)
- ์ ์ญ ๋ณ์๋ฅผ ๊ฐ๋ฐ์๊ฐ
์๋ํ์ฌ
์ ์ธํ ๊ฒฝ์ฐ, ํด๋น ์ฝ๋๋ฅผ ์ด๋์๋ ์ฐธ์กฐํ๊ฑฐ๋ ํ ๋นํ๊ฒ ๋ค๋ ๊ฒ๋๋ค. - ๋ณ์์ ์ ํจ ๋ฒ์๊ฐ ํด์๋ก ๊ฐ๋ ์ฑ์ ๋๋น ์ง๋๋ค.
- ์์ธกํ์ง ๋ชปํ ์์ญ์์ ๋ณ์์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ์ํ์ฑ์ด ๋์์ง๋๋ค.
- ์ ์ญ ๋ณ์๋ฅผ ๊ฐ๋ฐ์๊ฐ
-
๊ธด ์๋ช ์ฃผ๊ธฐ(Long Life Cycle)
- ์ ์ญ ๋ณ์๋
์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ช ์ฃผ๊ธฐ
์ ๋์ผํฉ๋๋ค. - ํ์ฑํ ๋์ด ์๋ ์๊ฐ์ด ๊ธฐ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ์์๋ ์ค๋ ์๋นํฉ๋๋ค.
- ์ ์ญ ๋ณ์์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ ์ํ์ฑ์ด ๋์ต๋๋ค.
var
ํค์๋๋ ๋ณ์ ์ค๋ณต ์ ์ธ์ ํ์ฉํ๋ฏ๋ก ์๋์น ์์ ์ฌํ ๋น์ด ์ด๋ค์ง ์ ์์ต๋๋ค.
- ์ ์ญ ๋ณ์๋
-
์ค์ฝํ ์ฒด์ธ์ ์ข ์ (Endpoint to Scope Chain)
- ์ ์ญ ๋ณ์๊ฐ
๊ฐ์ฅ ๋ง์ง๋ง์
๊ฒ์๋ฉ๋๋ค. ์ฆ, ์ ์ญ ๋ณ์์ ๊ฒ์ ์๋๊ฐ ๊ฐ์ฅ ๋๋ฆฝ๋๋ค.
- ์ ์ญ ๋ค์์คํ์ด์ค ์ค์ผ(Global Namespace Pollution)
- ์๋ฐ์คํฌ๋ฆฝํธ๋
ํ์ผ์ด ๋ถ๋ฆฌ
๋์ด ์์ด๋ ํ๋์ ์ ์ญ ์ค์ฝํ๋ฅผ ๊ณต์ ํฉ๋๋ค. - ๋ค๋ฅธ ํ์ผ์ ๋์ผํ ์ด๋ฆ์ ์ ์ญ ๋ณ์๊ฐ ์กด์ฌํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ํ์ฑ์ด ๋์์ง๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋
์ ์ญ ๋ณ์์ ๋ฌด๋ถ๋ณํ ์ฌ์ฉ์ ์ํํ๋ฐ, ์ด๋ป๊ฒ ์ด๋ฅผ ๋ฐฉ์ง(์ต์ )ํ ๊น์?
์ ์ญ ๋ณ์๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ ์ด์ ๊ฐ ์๋ค๋ฉด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณ์์ ์ค์ฝํ๋ ํ์, ์ฆ ์ข์์๋ก ์ข์ต๋๋ค. ํ์ํ ์ํฉ์์ ์์ฑ๊ณผ ์๋ฉธ์ ๋ฐ๋ณตํ๊ฒ ๋ง๋ค์ด์ผ ๋ช
์์ ์ธ ๊ฒฐํฉ
์ด ๊ฐ๋ฅํด์ง๋๊น์. ๊ทธ๋ผ ์ด๋ค ๋ฐฉ์์ ํตํด ๋ฐฉ์งํ ์ ์๋์ง ์์๋ณผ๊น์?
-
์ฆ์ ์คํ ํจ์(Immediately Invoked Function Expression)
๋จ ํ ๋ฒ ํธ์ถ
๋๋ ํน์ฑ์ ํตํด ๋ชจ๋ ๋ณ์๋ฅผ ์ฆ์ ์คํ ํจ์์ ์ง์ญ ๋ณ์๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.- ์ ์ญ ๋ณ์๋ฅผ ์์ฑํ์ง ์์ผ๋ฏ๋ก
๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.(function(){ var x = 10; // IIFE์ ์ง์ญ ๋ณ์ }()); console.log(x); // ReferenceError: x is not defined
-
์ ์ญ ๋ค์์คํ์ด์ค ๊ฐ์ฒด(Global Namespace Object)
- ์ ์ญ์ ๋ค์์คํ์ด์ค ์ญํ ์ ๋ด๋นํ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ , ์ฌ์ฉํ ์ ์ญ ๋ณ์๋ฅผ ํ๋กํผํฐ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ์ง๋ฏ๋ก ์๋ณ์๊ฐ ์ถฉ๋ํ ๊ฐ๋ฅ์ฑ์ ๋ฎ์์ง๋, ํด๋น ๊ฐ์ฒด๊ฐ
์ ์ญ ๋ณ์
์ ํ ๋น๋๋ฏ๋ก ์ ์ฉํ์ง ์์ต๋๋ค.var APP = {}; // ์ ์ญ ๋ค์์คํ์ด์ค ๊ฐ์ฒด // ์์ ๊ฐ ํ ๋นํ๊ธฐ App.school = false; // ์ฐธ์กฐ ๊ฐ ํ ๋นํ๊ธฐ App.person = { name: 'amy', age: 16, }; console.log(App.school); // false console.log(App.person.name); // amy
-
๋ชจ๋ ํจํด(Module Pattern)
- ํด๋์ค(Class)๋ฅผ ๋ชจ๋ฐฉํฉ๋๋ค. ๋ณ์, ํจ์๋ฅผ ๋ชจ์ ์ฆ์ ์คํ ํจ์๋ก ๊ฐ์ธ ํ๋์ ๋ชจ๋์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์
ํด๋ก์
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค. ๋์ค์ ๋ ์์ธํ ์์๋ด์! - ์ ๊ทผ ์ ์ด์๊ฐ ์กด์ฌํ์ง ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง์ธ ์บก์ํ(Encapsulation) ๋ฅผ ํ๋ด ๋ผ ์ ์์ต๋๋ค.
var App = (function(){ // ์ธ๋ถ์์ ์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ private ๋ณ์ var year = 2021; return { older() { return ++year; }, younger() { return --year; }, getYear() { return year; } } }()); console.log(App.year); // undefined console.log(App.older()); // 2022 console.log(App.getYear()); // 2022 console.log(App.older()); // 2023 console.log(App.getYear()); // 2023 console.log(App.younger()); // 2022 console.log(App.getYear()); // 2022
- ์ ์ฆ์ ์คํ ํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๊ฐ์ฒด์๋ ์ธ๋ถ์ ๋ ธ์ถ์ํค๊ณ ์ถ์ ๋ณ์, ํจ์๋ฅผ ๋ด์ฃ . ์ฆ, ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ํผ๋ธ๋ฆญ ๋ฉค๋ฒ(Public Member)๋ก ์ธ๋ถ์์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ๊ฐ์ฒด์ ์ถ๊ฐํ์ง ์์ ํ๋กํผํฐ๋ ํ๋ผ์ด๋น ๋ฉค๋ฒ(Private Member)๋ก ์ธ๋ถ์์ ์ฐธ์กฐํ ์ ์๊ฒ ๋ฉ๋๋ค.
-
ES6 ๋ชจ๋
- ES6์ ์ถ๊ฐ๋ ๋ชจ๋์ ํ์ผ ์์ฒด์ ๋ชจ๋ ์ค์ฝํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฆ ๋ชจ๋ ๋ด์์ ์ ์ธํ ์ ์ญ ๋ณ์๋ window ๊ฐ์ฒด์ ํ]๋กํผํฐ๊ฐ ์๋๋๋ค.
- HTML์
<script type='module' src='app.js'></script>
ํํ๋ก ์ถ๊ฐํ๋ฉด ๋ก๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผapp.js
๋ ๋ชจ๋๋ก์ ๋์ํฉ๋๋ค. - ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋๋ฉด ์ฌ์ฉํ ์ ์๊ธฐ์, Webpack ๋ฑ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.