์ ์๊ธฐ - ์ ๋ฐ ์์
๋ด์ฉ์ ๊ธฐ์ตํด๋ผ | ๋จ์ ์์
์ ๋ฆฌ
Function Declaration
;
์์ฑํ ํ์์๋ ํ๋์ ๊ตฌ๋ฌธ
function
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ ์ด๋ฆ๊ณผ ํจ๊ป ์ ์ธํฉ๋๋ค.์คํ ๊ฒฐ๊ณผ:
์ฝ์์์ test1
์ ํธ์ถํ๋ฉด "test1"
์ด ์ถ๋ ฅ๋ฉ๋๋ค. ํจ์ test1
์ ํ์ผ ๋ด ์ด๋์์๋ ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค.
Function Expression
ํจ์๋ฅผ ํ๋์ ๊ฐ์ฒ๋ผ ๋ณ์์ ๋์ ํ๋ ๋ฐฉ์
์คํ ๊ฒฐ๊ณผ:
์ฝ์์์ test2
๋ฅผ ํธ์ถํ๋ฉด "test2"
๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. test2
๋ ๋ณ์ ์ ์ธ ํ์๋ง ํธ์ถ ๊ฐ๋ฅํฉ๋๋ค.
Immediately Invoked Function Expression
์ฆ์ ์คํ ํจ์ ํํ์
ํจ์ ์ ์ธ๊ณผ ๋์์ ํธ์ถํ๋ ๋ฌธ๋ฒ
๋ณ์ ์ค์ฝํ๋ฅผ ์ ํํ๊ธฐ ์ํด ์ฌ์ฉ
(function() { ... })();
(function () {
const someName = "IIFE";
console.log(someName);
})();
์ค๋ช
:
- ์ต๋ช
ํจ์๋ฅผ ์ฆ์ ์คํํฉ๋๋ค.๐ฅ
- someName ๋ณ์
๋ IIFE
๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค. ์ธ๋ถ์์ ์ด ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ถ๋ ฅ: IIFE
(์ฝ์์ ์ถ๋ ฅ).
const someName = "IIFE";
console.log(someName);
์ ์ญ ๋ณ์ someName
์ ์ ์ธํ์ฌ ๊ฐ "IIFE"
๋ฅผ ์ถ๋ ฅ.IIFE
๋ด๋ถ์ someName ๋ณ์
์ ์ถฉ๋ํ์ง ์์ต๋๋ค. ๐ฅIIFE
๋ ์์ฒด ์ค์ฝํ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
๋๋ค.IIFE
(์ฝ์์ ์ถ๋ ฅ).(function (food) {
console.log(`I Love ${food}~`);
})("๐๐๐");
IIFE
์ ๋งค๊ฐ๋ณ์(food)
๋ฅผ ์ ๋ฌํฉ๋๋ค."๐๐๐"
๋ฅผ ์ ๋ฌํ์ฌ ๋ด๋ถ์์ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด(`)
์ ์ฌ์ฉํด "I Love ๐๐๐~"
๋ฅผ ์ถ๋ ฅ.I Love ๐๐๐~
(์ฝ์์ ์ถ๋ ฅ).Arrow Function
์ต๋ช ํจ์๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ
() => {}
(a, b) => {ํจ์ ๋ด์ฉ}
test3
๋ ์ต๋ช
ํจ์๋ฅผ const ๋ณ์
์ ํ ๋นํ ํจ์ ํํ์(Function Expression)์
๋๋ค. ๋ด๋ถ์์ ๋ ๊ฐ์ ๋ค๋ฅธ ํจ์(foo
์ bar
)๋ฅผ ํธ์ถํ๊ณ ์์ต๋๋ค.
foo("ํ๊ธธ๋")
ํธ์ถ:
foo ํจ์
๋ ๋ฌธ์์ด "ํ๊ธธ๋"
์ ์ธ์
๋ก ์ ๋ฌ๋ฐ์ต๋๋ค.
์คํ ๊ฒฐ๊ณผ๋ก foo: ํ๊ธธ๋
์ด ์ถ๋ ฅ๋ฉ๋๋ค. ์ด๋ foo ํจ์
๊ฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ก๊ทธ์ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์์ํฉ๋๋ค.
bar("์ ์ฌ์๋น")
ํธ์ถ:
bar ํจ์
๋ ๋ฌธ์์ด "์ ์ฌ์๋น"
์ ์ธ์
๋ก ์ ๋ฌ๋ฐ์ต๋๋ค.
์คํ ๊ฒฐ๊ณผ๋ก bar: ์ ์ฌ์๋น
์ด ์ถ๋ ฅ๋ฉ๋๋ค.
์ด๋ bar ํจ์
์ญ์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ๊ฐ๊ณตํ์ง ์๊ณ ๋ฐ๋ก ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์์ํฉ๋๋ค.
const foo = (name) => console.log("foo: ", name);
์ค๊ดํธ {}
๋ฅผ ์๋ตํ ์ ์์ต๋๋ค. ์ค๊ดํธ๋ฅผ ์๋ตํ๋ฉด ํด๋น ์ค์ ๊ฒฐ๊ณผ๊ฐ ์๋์ผ๋ก ๋ฐํ๋ฉ๋๋ค(๋ฆฌํด๊ฐ์ด ์๋ ๊ฒฝ์ฐ).console.log("foo: ", name);
์ ํ ์ค์ง๋ฆฌ ์คํ ์ฝ๋์ด๋ฏ๋ก ์ค๊ดํธ๋ฅผ ์๋ตํ ๊ฒ์
๋๋ค.
- ์๋ต ๊ฐ๋ฅ ์์:
const foo = name => console.log("foo: ", name);
- ์๊ดํธ ์ฌ์ฉ:
const foo = (name) => console.log("foo: ", name);
์๊ดํธ ()
๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.์๊ดํธ
๋ฅผ ์๋ตํ์ง ์๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.(name)
์ฒ๋ผ ํญ์ ์๊ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.์์: ์ค๊ดํธ์ return
์๋ต
const bar = (name) => `bar : ${name}`;
์ค๊ดํธ {}
์ return
ํค์๋๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.bar: ${name}
๋ฌธ์์ด์ด ์๋์ผ๋ก ๋ฐํ๋ฉ๋๋ค.JavaScript์์๋ ํจ์๊ฐ ์ผ๊ธ ๊ฐ์ฒด(First-Class Object)๋ก ์ทจ๊ธ๋ฉ๋๋ค. ์ด๋ ํจ์๋ฅผ ๋ณ์์ ๋์ ํ๊ฑฐ๋, ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๊ฑฐ๋, ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
const func = () => console.log("HelloWorld");
console.log(func); // () => console.log("HelloWorld")
func(); // HelloWorld
(name) => {}
๋ ๋ณ์ func
์ ์ ์ฅ๋ฉ๋๋ค.console.log(func)
๋ ํจ์ ์์ฒด๋ฅผ ์ถ๋ ฅํ๊ณ , func()
๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.const test = (callback) => {
callback(); // ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ํจ์๋ฅผ ํธ์ถ
};
test(() => console.log("This is a callback!")); // This is a callback!
test ํจ์
๋ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ํจ์๋ฅผ callback()
์ผ๋ก ํธ์ถํฉ๋๋ค.const test4 = () => {
const func = () => console.log("HelloWorld");
console.log(func); // () => console.log("HelloWorld")
func(); // HelloWorld
return func; // ํจ์๋ฅผ ๋ฐํ
};
const f = test4(); // test4 ํจ์๊ฐ ๋ฐํํ func๋ฅผ ๋ณ์ f์ ์ ์ฅ
console.log(f); // () => console.log("HelloWorld")
f(); // HelloWorld
test4 ํจ์
๋ func ํจ์
๋ฅผ ๋ฐํํ๋ฉฐ, ๋ฐํ๋ ํจ์๋ ๋ณ์ f
์ ์ ์ฅ๋ฉ๋๋ค.f()
๋ฅผ ํธ์ถํ๋ฉด ๋ฐํ๋ ํจ์ func
๊ฐ ์คํ๋ฉ๋๋ค.func๋ฅผ ์ ๋ฌํด์ runnerํจ์๋ฅผ ํธ์ถ
const r = (i) => console.log(`Helloworld${i}`);
runner2(r);
r
์ ํ์ดํ ํจ์(Arrow Function)๋ก ์ ์๋์์ต๋๋ค.์ธ์ i
๋ฅผ ๋ฐ์์ ๋ฌธ์์ด "Helloworld" ๋ค์ i
๊ฐ์ ๋ถ์ฌ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค.runner2(r)
๋ฅผ ํธ์ถํ๋ฉฐ, ํจ์ r
์ runner2
์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค.const runner = (f) => {
for (let i = 0; i < 10; i++) {
f(); // ์ ๋ฌ๋ฐ์ ํจ์ f ์คํ
}
};
const runner2 = (f) => {
for (let i = 0; i < 10; i++) {
f(i + 1); // ๋ฐ๋ณต๋ฌธ์์ ์ฆ๊ฐ๋ i ๊ฐ์ ์ ๋ฌ
}
};
์ด ์ฝ๋๋ ํด๋ก์ (closure)์ ๊ณ ์ฐจ ํจ์(high-order function)๋ฅผ ํ์ฉํ์ฌ ๋์ ์ผ๋ก ๋์ํ๋ ํจ์๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค
const desertMaker = () => console.log("๐ฐ");
console.log(f); // undefined (์ฝ์์ ์ถ๋ ฅ๋ ๊ฐ์ ์์, ์ด๋ฏธ desertMaker๋ ์คํ๋จ)
f(); // TypeError: f is not a function
const customDesertMaker = (desert) => {
return (name) => console.log(`${name}์๊ฒ ${desert}๋ฅผ ๋ณด๋ธ๋ค.`);
};
const printCandy = customDesertMaker("๐ฌ");
printCandy("๊ธธ๋"); // "๊ธธ๋์๊ฒ ๐ฌ๋ฅผ ๋ณด๋ธ๋ค."
const printIcecream = customDesertMaker("๐ฆ");
printIcecream("์ฌ์๋น"); // "์ฌ์๋น์๊ฒ ๐ฆ๋ฅผ ๋ณด๋ธ๋ค."
- ํด๋ก์ (Closure)
customDesertMaker๋ ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ๋ด๋ถ ํจ์์์ ์ ์งํ ์ ์๋ ํด๋ก์ ๋ฅผ ์์ฑํฉ๋๋ค.
๋ด๋ถ ํจ์์์ desert ๊ฐ์ ๊ธฐ์ตํ๊ณ , ์ด๋ฅผ ํ์ฉํ์ฌ ๋์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํฉ๋๋ค.- ๊ณ ์ฐจ ํจ์(High-Order Function)
customDesertMaker๋ ํจ์๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์์ ๋๋ค.
๋ฐํ๋ ํจ์๋ name์ ๋ฐ์ ๋์ ํธ๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ ์ํํฉ๋๋ค.- ๋์ ํจ์ ์์ฑ
๋ค์ํ ๋์ ํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ๋์ ์ผ๋ก ์์ฑํ์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ ๋๋ค.