0228# ํ ์ต์คํผํน# "์กธ์
์๊ฑด" + "์ทจ์
"
๋ ๊ฐ์ง ๋ชฉ์ ์ ์ํด ํ ์ต์คํผํน ์ํ์ ์ค๋นํ๋ค.
์กธ์
์๊ฑด์ Lv.5, ์ทจ์
์๋ ์ต์ Lv.6๋ฅผ ์๊ตฌํ๋ ํ์ฌ๊ฐ ๋ง์๋ค.
๋ชฉํ๋ ๋ด์ฌ Lv.7์ ๊ธฐ๋ํ๋ฉด์ Lv.6๋ก ์ก์๋ค. (์ง๊ธ ์๊ฐํด๋ณด๋ฉด ์ฐธ ์์ผํ๋ ๋ชฉํ์ค์ )
๋
ํ (์ ํ๋ธ)
์ธํฐ๋ท ๊ฐ์
ํ์
3๊ฐ์ง ์ ํ์ง๊ฐ ์์๋๋ฐ, ๋น ๋ฅธ ์๊ฐ ์์ ์ ์๋ฅผ ์ป๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ + ํ ์ต์คํผํน์ํ์ ์ฑ๊ฒฉ์ ์ ํ ๋ชฐ๋๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฅ ํ์์ ๋ค๋๊ธฐ๋ก ํ๋ค.
์์ผํ ๋ชฉํ์ ์๋์ ์ผ๋ก ํ์์ ์์กดํ ์๊ฐ์ผ๋ก ์์ํด์ ๊ทธ๋ฐ์ง ํ์ ์์
๊ณผ ์คํฐ๋์์๋ ์ด์ฌํ ๊ณต๋ถํ๊ณ , ๋ฐ๋ก ์๊ฐ์ ๋ด์ ๊ณต๋ถํ์ง๋ ์๊ฒ ๋์๋ค. ์ง๊ธ ์๊ฐํด๋ณด๋ ๋น์ฐํ ๊ฒฐ๊ณผ์๋ค.
์ด๋ ๊ฒ ์ค์ ๊ต๋ด ๊ทผ๋ก์ ์คํ ํ์์ ๋ณํํ๋ ( ์ง -> ํ๊ต -> ๊ฐ๋จ -> ์ง
์ ์ด์ธ์ ์ธ ํตํ ์ค์ผ์ฅด..) 2์ฃผ๊ฐ ์์๊ฐ์ ์ง๋๊ฐ๊ณ , ์ด์ฌํ ๊ณต๋ถํ์ง ์์ ํ์ ๋น์ฅ ์ํ๋ณผ ์์ ์ด ์์ด 1์ฃผ๊ฐ ์ถ๊ฐ๋ก ๋
ํ์ ํ๋ค.
ํ ์ต์คํผํน์ ์คํผํน ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ง์ ์๋ฆฌ๋ด์ด์ ๊ณต๋ถํด์ผํ๊ณ , ๊ทธ๋์ ์ง์์๊ณต๋ถ๋ฅผ ํ๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ ๋ฌธ์ ์ค๋์ค ํ์ผ๋ ์ง์ ์ฌ์ํด์ผํ๊ณ , ์ง์ ์๊ฐ์ ์ฌ์ผํ๊ณ , ๋
น์๊ธฐ๋ ํค๋ ๋ฑ ์ด๊ฒ์ ๊ฒ ์ ๊ฒฝ์ฐ๋ฉด์ ๊ณต๋ถํด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ํ์ฅ์ ๊ฐ๋ ์คํผํนํ๊ธฐ ์ข์(?) ํ๊ฒฝ์์ ์ด๋ ์ ๋์ ๊ธด์ฅ๊ฐ๊ณผ ํจ๊ป ์ํ์ ์น๋ฃจ๋ ์คํ๋ ค ๋ชจ์๊ณ ์ฌ ํ ๋๋ณด๋ค ์ง์ค๋๊ณ ์ ๋ณธ ๋๋์ด์๋ค.
๋ฐ์ฑ# ๊ฒฐ๊ณผ๋ Lv.6. ์๋ฌดํผ ํ์ํ ์๊ตฌ์กฐ๊ฑด์ ๋ง์กฑ์์ผฐ์ง๋ง ๋๋ฆ Lv.7์ ๋ฐ๋์ ๊ทธ๋ฐ์ง ์กฐ๊ธ ์ค๋ง์ค๋ฌ์ ๋ค. ํ์ง๋ง ๊ฒฐ๊ตญ ์์ผํ๊ฒ ์์ด ๋ชฉํ์ ๋น์ฐํ ๊ฒฐ๊ณผ์๋ ๊ฒ ๊ฐ๊ณ , ์ํ์ ์ ๋ด์ผํ๋ ์ด์ ์์ฒด๊ฐ ๋ถ๋ถ๋ช
ํ๋ ๊ฒ ๊ฐ๋ค.
์๋ฌดํผ ์ฌ๊ธฐ๊น์ง TIL์ 3์ฃผ๊ฐ ๊ฒ์๋ฆฌํ ๋ณ๋ช
์ด๋ค.
JavaScript# ๋๋์ด HTML, CSS๋ฅผ ๋๋ด๊ณ JavaScript๋ก ๋์ด์๋ค. Markup Language๋ง ํ๋ค๊ฐ ์ค๋๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๊ณต๋ถํ๋ ์คํ๋ ค ์ฌ๋ฏธ์์๋ค. HTML, CSS๋ ์์ฑ ์ญํ ์ ์์งํ๊ณ , ์ฌ์ฉ๋ฒ์ ์ตํ๋ ์์ค์ด๋ผ ํฅ๋ฏธ๊ฐ ๋จ์ด์ก๊ณ , JS๋ฅผ ๋ค๋ฃฐ ์ค ์์์ผ ์๋ฏธ์๋ ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณผ ์ ์๊ฒ ๋ค ์ถ์ด JS๋ฅผ ๋นจ๋ฆฌ ๊ณต๋ถํ๋ ค๊ณ ํ๋ค.
๊ธฐ์ด์ ์ธ ๋ฌธ๋ฒ# ํ๋ก ํธ์๋ ์น๊ฐ๋ฐ ํจํค์ง ๊ฐ์ข๋ฅผ ํตํด ๊ธฐ์ด์ ์ธ JS ๋ฌธ๋ฒ์ ๋ฐฐ์ ๋ค. ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ ์ฌํ ๋ถ๋ถ์ ์ง๋๊ฐ๊ณ , ์ ์ํด์ผ๊ฒ ๋ค๊ณ ๋ฐ๊ฒฌํ ๋ถ๋ถ๋ง ์ ๋ฆฌํ๋ค.
MISC# CodeSandbox : javascript๋ฅผ ํ์ตํ๊ธฐ ์ข์ ide
์๋ฐ์ดํ "
์ ๋ฐ์ดํ '
๋ ๋ ์ค ์๋ฌด๊ฑฐ๋ ๊ฐ๋ฅ. (CodeSandbox์์๋ .prettierrc
์์ ์ค์ ์ ํตํด cmd
+ s
ํ ๋ ๋ฐ์ดํ์ ์๋ฐ์ดํ ์ค ์ ํํ๊ฒ์ผ๋ก ๋ณํ์์ผ์ค๋ค.)
;
๋ ์๋ต ๊ฐ๋ฅ. ํ์ง๋ง ๊ฐ๋
์ฑ์ ์ํด ์ถ๊ฐํ๋ ๊ฒ ๊ถ์ฅ.
๋ณ์์ ์์# JS์์๋ ๋ณ์, ์์๋ฅผ ์ ์ธํ ๋ type ๋ณ๋ก ์ ์ธํ์ง ์๊ณ let
, const
, ๊ทธ๋ฆฌ๊ณ var
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
let
์ ๋ณ์, ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค. ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ๋ ๋ค์ ์ ์ธํ ์ ์๋ค.
const
๋ ์์, ํ๋ฒ ์ค์ ํ๋ฉด ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค. immutable
var
์ญ์ ๋ณ์. ๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ๋ ๋ค์ ์ ์ธํ ์ ์๋ค.
var ๋ ํ์ฌ ๊ถ์ฅ๋์ง ์๋ ๋ณ์.IE9, IE10 ๋ฑ์ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ let , const ๊ฐ ์์ด์ ์ฌ์ฉ ๋ถ๊ฐํ๋ค.ํ์ง๋ง Babel ์ด๋ผ๋ ๋๊ตฌ๋ฅผ ํตํด JS ์ฝ๋๊ฐ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ๋์๊ฐ๋๋ก ํธํํด์ค ์ ์๊ธฐ ๋๋ฌธ์ var ๋ฅผ ์์ ํ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ๋ฐํ๋๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ด ์ธ์๋ var
, let
, const
๋ scope
์์ ์ฐจ์ด๊ฐ ์๋ค.
์ด๋ hoisting
, IIFE
์ ๊ด๊ณ๊ฐ ์๋๋ฐ, ์ ๋ฆฌ๋ ๋งํฌ๊ฐ ์์ด์ ๋งํฌ๋ก ์ฒจ๋ถ ๋์ค์ ๋ค์ ๋ณด๊ณ ๊ณต๋ถํ์.
๐ var, let, const ์ฐจ์ด์ ์?
Null, undefined# null
: ์๋ ๊ฒ.
undefined
: ๊ฐ์ด ์์ง ์ค์ ๋์ง ์์
var variable ; console . log ( variable ) ;
๋ณต์ฌ ๋น๊ต ์ฐ์ฐ์# ๋ค๋ฅธ PL๊ณผ ๋ฌ๋ฆฌ ==
, ===
๋ ๊ฐ์ง์ ์ผ์น์ฐ์ฐ์๊ฐ ์๋๋ฐ,
==
: ํ์
์ ๊ฒ์ฌํ์ง ์์ (์ซ์ 2์ ๋ฌธ์ '2'๊ฐ ๋์ผ)
===
: ํ์
์ ๊ฒ์ฌํจ.
ํจ์# ํจ์๋ ์ค๋ ๊ณต๋ถํ ๋ด์ฉ ์ค ๊ฐ์ฅ ์ค์ํ ๋ด์ฉ์ด๋ค. ๋ค๋ฅธ ์ธ์ด์์ ํจ์๋ฅผ ๋ค๋ค๋ณธ ์ ์ด ์์ง๋ง, ํจ์์ ์ ์๋ฅผ ๋ค์ ์ดํด๋ณธ๋ค.
์ผ๋ฐ์ ์ผ๋ก, ํจ์๋ ํจ์ ์ธ๋ถ (๋๋ ์ฌ๊ท(recursion)์ ๊ฒฝ์ฐ์ ๋ด๋ถ) ์ฝ๋์ ์ํดํธ์ถ๋ ์ ์๋ "ํ์ํ๋ก๊ทธ๋จ"์
๋๋ค. ํ๋ก๊ทธ๋จ ๊ทธ ์์ฒด์ฒ๋ผ, ํจ์๋ ํจ์ ๋ชธํต (function body)์ด๋ผ๊ณ ํ๋ ์ผ๋ จ์ ๊ตฌ๋ฌธ(statement)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ฐ์ ํจ์์์ ๋ฌ๋ ์ ์๊ณ ํจ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. - MDN web docs - ํจ์
JavaScript์์์ ํจ์์ ํน์ง์ ์ด๋ ๋ค๊ณ ํ๋ค.
JavaScript์์, ํจ์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ฒ๋ผ ์์ฑ ๋ฐ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์๊ธฐ์ ์ผ๊ธ (first-class) ๊ฐ์ฒด์
๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด์ ํจ์๋ฅผ ๊ตฌ๋ณํ๋ ๊ฒ์ ํจ์๋ ํธ์ถ๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ฐ๋จํ ๋งํด, ํจ์๋ Function ๊ฐ์ฒด์
๋๋ค. - MDN web docs - ํจ์
ํจ์๋ ๋ฐํ ๊ฐ์ ์ง์ ํ๋ return
๋ฌธ์ด ์์ด์ผ ํ๋๋ฐ, return
๋ฌธ์ด ์๋ค๋ฉด ํจ์๋ ๊ธฐ๋ณธ๊ฐ์ ๋ฐํํ๋ค. ๊ธฐ๋ณธ ๋ฐํ๊ฐ์ undefined
์ด๋ค.
ํจ์ ์ ์# ํจ์๋ฅผ ์ ์ํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๋๋ฐ.
๋จผ์ ํจ์ ์ ์ธ์ ์ด๋ ๋ค.
function name ( [ param [ , param [ , ... param ] ] ] ) { statements }
๋ณต์ฌ ํจ์๋ฅผ ์ ์ธํ ์ดํ์ ์ด๋ฆ์ผ๋ก ํธ์ถํด์ผ ํ๊ธฐ ๋๋ฌธ์ name
์ด ํ์์ ์ด๊ณ , param
์ ํจ์์ ์ ๋ฌ๋๋ ์ธ์์ ์ด๋ฆ์ผ๋ก 255๊ฐ๊น์ง ๊ฐ๋ฅํ๋ค. statements
๋ ํจ์์ ๋ชธํต์ ๊ตฌ์ฑํ๋ค.
๋ค์์ผ๋ก ํจ์ ํํ์์ด๋ค.
ํจ์ ํํ์์ ํจ์ ์ ์ธ๊ณผ ๋น์ทํ๊ณ ๊ตฌ๋ฌธ์ด ๊ฐ์๋ฐ, ์ฐจ์ด์ ์ ๋ณ์์ ํจ์๋ฅผ ํ ๋นํ๋ค๋ ๊ฒ์ด๋ค.
var myFunction = function [ name ] ( [ param [ , param [ , ... param ] ] ] ) { statements }
๋ณต์ฌ ์ด ๋๋ name
์ ์๋ตํ๊ณ , ์ต๋ช
(anonymous) ํจ์๋ก ์ฌ์ฉํ ์ ์๊ณ , name
์ ๋ฃ์ด์ named
๋ก ์ฌ์ฉํ ์๋ ์๋ค.
์ต๋ช
ํจ์๋ก ์ฌ์ฉํ ๋ ๋ณ์๋ช
(์์์ myFunction
)์ ํจ์์ ์ด๋ฆ์ผ๋ก ์๊ฐํ๋ฉด ์๋๋๋ฐ, ํจ์์ ์ฐธ์กฐ๊ฐ์ด myFunction
์ด๋ผ๋ ๋ณ์์ ์ ์ฅ๋ ๊ฒ์ด๋ค.
์ด๋๊น์ง๋ '์ต๋ช
' ํจ์์ด๊ณ , ํจ์ ๋ณ์์ธ myFunction
์ ํตํด ํธ์ถ ํ๋ ๊ฒ์ด๋ค.
๋ํ named
ํจ์์ ๊ฒฝ์ฐ์ ํจ์ ๋ณ์์ธ myFunction
์ผ๋ก ์ธ๋ถ์์ ํธ์ถํ ์ ์์ง๋ง, ํจ์ ์ด๋ฆ name
์ผ๋ก๋ ํจ์ ๋ด๋ถ์์๋ง ํธ์ถํ ์ ์๊ณ ์ธ๋ถ์์๋ ํธ์ถํ ์์๋ค.
Function ์์ฑ์๋ ์ ์ฌ์ฉ๋์ง ์๊ณ ๊ถ์ฅ๋์ง๋ ์๋ ๋ฐฉ์์ธ๋ฐ, ๊ตณ์ด ์์๋ณด์๋ฉด,
var myFunction = new Function ( arg1 , arg2 , ... argN , functionBody ) ;
๋ณต์ฌ var myFunction = new Function ( 'a' , 'b' , 'console.log(a+b)' ) ; myFunction ( 1 , 3 ) ;
๋ณต์ฌ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
ํจ์ ์ ์ธ๊ณผ ํจ์ ํํ์์ ์ค์ํ ์ฐจ์ด๋ ํธ์ด์คํ
(hoisting)์ด๋ค. ํ๊ตญ์ด๋ก๋ '๋์ด์ฌ๋ฆผ'์ ๋ปํ๋ค.
์ธํฐํ๋ฆฐํฐ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํด์ํจ์ ์์ด์ Global ์์ญ์ ์ ์ธ๋ ์ฝ๋๋ธ๋ญ์ ์ต์์ Scope๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ ํธ์ด์คํ
์ด๋ผ ํ๋ค. - Function Declarations(ํจ์์ ์ธ) vs Function Expressions(ํจ์ํํ) ์์
๋จ์ํ๊ฒ ์๊ฐํด์ ์ ์ธ๋ฌธ์ ํญ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๊ตฌ๋์ ์ต์ฐ์ ์ ์ผ๋ก ํด์๋๋ค. ํ์ง๋ง ํ ๋น์ hoisting์ด ๋์ง ์๋๋ค.
foo ( ) ; function foo ( ) { console . log ( 'hello' ) ; } ; > hello
bar ( ) ; var bar = function ( ) { console . log ( 'hello' ) ; } ; > TypeError : bar is not a function
๋ณต์ฌ ์์ ์ถ์ฒ : Function Declarations(ํจ์์ ์ธ) vs Function Expressions(ํจ์ํํ)
์์ 1์ฒ๋ผ ํจ์ ์ ์ธ์ ๊ฒฝ์ฐ๋ ์ ์ธ๋ฌธ์ด hoisting ๋์ด ์ต์์ scope๋ก ๋์ด์ฌ๋ ค์ก๊ธฐ๋๋ฌธ์ ํจ์ ์ด๋ฆ์ธ foo();
๋ก ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์์ 2์ ๊ฒฝ์ฐ๋ ํจ์ ํํ์ผ๋ก ๋์ด์๊ณ , ๋ฐ๋ผ์ hoisting๋๋ ๋ถ๋ถ์ ์ ์ธ๋ถ๋ถ์ธ var bar;
๋ฟ์ด๋ค. ๋ฐ๋ผ์ bar();
๋ก ํธ์ถํ์ ๋๋ bar
๋ ๋จ์ง ๋ณ์์ผ๋ฟ์ด๋ผ์ TypeError: bar is not a function
์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ด์ธ์ IIFE
, Closure
๋ฑ์ ๊ฐ๋
์ด ์ฐ๊ด๋ ๊ฒ๊น์ง ํ์ธํ์๋๋ฐ, ์ด๋ ๋ค์์ ์์๋ณด๋ ๊ฒ์ผ๋ก ๋ง์น๋ค.
Reference# ๐ MDN web docs - ํจ์
๐ Function Declarations(ํจ์์ ์ธ) vs Function Expressions(ํจ์ํํ)
๐ ํจ์ ํํ์ vs ํจ์ ์ ์ธ์
๐ Javascript IIFE ์ดํดํ๊ธฐ
๐ var, let, const ์ฐจ์ด์ ์?
๐ [JS] ํจ์ ์์ฑ ๋ฐฉ๋ฒ: ํจ์ ํํ์, ํจ์ ์ ์ธ, Hoisting