JavaScript์ ํจ์๋ 1๊ธ ๊ฐ์ฒด(first class object)์ด๋ค.
1๊ธ ๊ฐ์ฒด(first class object)์ ๋ํด ์๊ธฐํ๋ ค๋ฉด ๋จผ์ 1๊ธ ์๋ฏผ(first class citizen) ๋ถํฐ ์๊ธฐํด์ผ ํ๋๋ฐ,
์๋ฏผ์ ์๋ฏผ์ด์ง 1๊ธ ์๋ฏผ์ด๋ ๋ญ๊น?
๐ฉ๐ปโ๐ซ 1๊ธ ์๋ฏผ?
๐จ 1๊ธ ์๋ฏผ์ ํฌํ๊ถ์ด ์๋ค.
๐จ๐ปโ๐ญ 1๊ธ ์๋ฏผ์ ๊ตฐ์ธ์ด ๋ ์ ์๋ค.
๐ ๐ผโโ๏ธ 1๊ธ ์๋ฏผ์ ์ ์น์ ์ฐธ์ฌ ํ ์ ์๋ค.
19์ธ๊ธฐ ์ด ์๊ตญ์์๋ ๋จ์ฑ์ 1๊ธ ์๋ฏผ, ์ฌ์ฑ์ 2๊ธ ์๋ฏผ์ผ๋ก ๋ถ๋ฅํ์ผ๋ฉฐ, 2๊ธ ์๋ฏผ์ ์ ์น์ ์ฐธ์ฌ ํ ์ ์์๋ค.
์ฆ, 1๊ธ ์๋ฏผ์ด๋ผ๋ ๋ง์ ๊ถํ์ ๋ง์ด ๋๋ฆฌ๋ ๋์์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ 1๊ธ ์๋ฏผ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฒ์ ๋งํ๋ค.
const a = 1; // ๋ณ์์ ๋ด์ ์ ์๋ค.
function f1(num) {
// parameter๋ก ์ ๋ฌํ ์ ์๋ค.
const b = num + 1;
return b; // return value์ผ๋ก ์ ๋ฌํ ์ ์๋ค.
}
console.log(f1(a)); // 2๊ฐ ์ถ๋ ฅ
โ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ number
์ strung
์ 1๊ธ ์๋ฏผ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ค.
1๊ธ ๊ฐ์ฒด๋, 1๊ธ ์๋ฏผ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฐ์ฒด(Object) ์ด๋ค.
javascript์ function๋ ๊ฐ์ฒด์ด๋ฏ๋ก, 1๊ธ ๊ฐ์ฒด์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ค.
const a = {msg: "a๋ 1๊ธ ๊ฐ์ฒด"} // ๋ณ์์ ๋ด์ ์ ์๋ค.
function f1 (a) { // parameter๋ก ์ ๋ฌํ ์ ์๋ค.
const b = a
b.msg2 = "2๋ฒ์งธ ๋ฉ์ธ์ง"
return b // return value์ผ๋ก ์ ๋ฌํ ์ ์๋ค.
}
console.log(f1(a)) // {msg: 'a๋ 1๊ธ ๊ฐ์ฒด์
๋๋ค.', b: '์ด๊ฒ์ 2๋ฒ์งธ ๋ฉ์ธ์ง์
๋๋ค.'} ์ถ๋ ฅ
๋ง์ฐฌ๊ฐ์ง๋ก, 1๊ธ ์๋ฏผ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ํจ์๋ฅผ 1๊ธ ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋จ, 1๊ธ ํจ์๋ 1๊ธ ์๋ฏผ์ ์กฐ๊ฑด๊ณผ ๋๋ถ์ด ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ ์๊ตฌํ๋ค.
javascript์ function์ 1๊ธ ์๋ฏผ, ๊ฐ์ฒด, ํจ์๋ฅผ ๋ชจ๋ ๋ง์กฑ์ํจ๋ค. (๋ณดํต์ 1๊ธ ๊ฐ์ฒด๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
1๊ธ ๊ฐ์ฒด๊ฐ ๋์ฒด ๋ญ๊ธธ๋ ์ค์ํ๊ฑธ๊น?
โ ๋ฐ๋ก 1๊ธ ๊ฐ์ฒด๋ ๊ณ ์ฐจ ํจ์(high order function)๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ!!
(ํจ์๋ฅผ ๋๊ฒจ์ฃผ๊ธฐ ์ํด ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ...์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ...ํ ํ์ ์์ด JavaScript์ each
, filter
, map
, sort
๋ฑ์ ํจ์๋ค์ ๋ชฉ์ ์ ๋ง๊ฒ ์ธ์๋ก ๋ฐ๋ก ๋๊ฒจ์ค ์ ์์ด์ ๋งค์ฐ ํธ๋ฆฌ!!)
๋ํ, ํด๋ก์ ธ(closure)์ ๋ง๋ ๋๋ ์ฌ๋ฌ๊ฐ์ง ์ฅ์ ์ด ์๊ธฐ๋๋ฐ, ์ฌ์ค ๋๋ ์์ง ๋ญ์๋ฆฐ์ง ๋ชจ๋ฅด๊ฒ ๋น....๐
๊ณ ์ฐจ ํจ์์ ํด๋ก์ ธ๋ ๊ธฐํ ๋ ๋ ๋ค์ ๊ณต๋ถํด์ ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค.
์๋ฌดํผ ๊ฒฐ๋ก ์ javascript์ function ์งฑ์งฑ๋งจ!!!
const print = function () { // anonymous function
console.log("print");
}
print(); // print ์ถ๋ ฅ
const printAgain = print;
printAgain(); //print ์ถ๋ ฅ
console.log(sum(4, 2)); //6 ์ถ๋ ฅ, ํจ์ ์ ์ธ๋ณด๋ค ํธ์ถ์ ๋จผ์ ํ๋๋ฐ ์ ์ธ์ด hoisting๋์ด ์ ์์ ์ผ๋ก ํธ์ถ ๋จ
function sum(a, b) {
const result = a + b;
return result;
}
alert("2 ๋ํ๊ธฐ 2๋ " + 2 + 2);
๋ ์ด๋ป๊ฒ ์ถ๋ ฅ๋ ๊น? 2 ๋ํ๊ธฐ 2๋ 4?
์คํํด๋ณด๋ฉด, 2 ๋ํ๊ธฐ 2๋ 22
๋ผ๋ ์๋ฆผ์ฐฝ์ด ๋ฌ๋ค.
ํ๋ก๊ทธ๋๋ฐ์ ์ผ์ชฝ์์๋ถํฐ ์์๋๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋๊ฒ!
์ฐธ๊ณ ๋ก ์์ ๊ฒฝ์ฐ์์
2 ๋ํ๊ธฐ 2๋ 4
๋ฅผ ์ ์์ ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์
์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค!
function randomQuiz(answer, printYes, printNo) { // ํน์ ์ด๋ฒคํธ์์ ํธ์ถ, ์ด๊ฒ์ด ๋ฐ๋ก Callback!
if (answer === "solmi") {
printYes(); // answer์ ์ผ์นํ๋ฉด printYes ํจ์๋ฅผ ํธ์ถ
} else {
printNo(); // answer์ ์ผ์นํ์ง ์์ผ๋ฉด printNo ํจ์ ํธ์ถ
}
}
const printYes = function () {
console.log("yes!!");
};
const printNo = function () {
console.log("No!!");
};
randomQuiz("coder", printYes, printNo); //"No!!" ์ถ๋ ฅ
randomQuiz("solmi", printYes, printNo); //"Yes!!" ์ถ๋ ฅ
function(x, y) { // ์ต๋ช
ํจ์๋ ์ด๋ฆ์ด ์์ด์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ํธ์ถ ํ ์ ์๋ค.
return x + y;
}
const add = function(x, y) { // ๋ณ์์ ์ ์ฅํ ํ์ ๋ณ์์ ์ด๋ฆ์ ํตํด ํธ์ถ
return x + y;
}
add(1, 2); // 3 ์ถ๋ ฅ
const printNo = function ptint() {
console.log("no");
print(); // ํจ์ ์์์ ๋ณธ์ธ ํจ์๋ฅผ ํธ์ถ ๊ฐ๋ฅ
};
๋๋ฒ๊น ํ ๋, error stack trace์์ ์๋ฌ๊ฐ ๋ฐ์ํ ํจ์์ ์ด๋ฆ์ ๋ํ๋ด๊ธฐ ์ํด ์ด๋ฆ์ ๋ถ์ธ๋ค.
stack property๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋๋ฐ, ์๋ฌ๋ฅผ ์ผ์ผํจ ํ์ผ์ ๋ํ history ๋ฅผ ์ ๋ฌํด์ค๋ค.(๊ณ ํ๋ค. ์ ๋ชจ๋ฆ)
๋๋ฒ๊น ์ ๋ํด์ ์ข ๋ ๊ณ ์๊ฐ ๋๋ฉด ์ ๋ฆฌํด๋ด์ผ์ง....
๊ทธ๋ฆฌ๊ณ ์์ ์ฒ๋ผ ํจ์ ์์์ ๋ณธ์ธ ํจ์๋ฅผ ํธ์ถํ ๋ ์ฐ์ธ๋ค. (์์ ์ฒ๋ผ ์์ฑํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํฐ์ ธ๋ฒ๋ฆฌ์ง๋ง, ์๋ฌดํผ ์กฐ๊ฑด๊ฐ์ด๋ ํน์ ๋ก์ง์ ๋ฃ์ด์ ์ด๋ค ๊ฐ์ ๊ณ์ฐํ๋ค๋์ง ๋ฑ๋ฑ ํ์ฉ ๋ฐฉ๋ฒ์ด ๋ง์ด ์๋ค.)
(๋งค๊ฐ๋ณ์ ๋ชฉ๋ก) => {ํจ์ ๋ด์ฉ}
ํ์์ผ๋ก ์์ฑconst add = function (x, y) {
return x + y;
}
์ซ์ ๋๊ฐ ๋ํ ๋ฟ์ธ๋ฐ 3์ค์ด๋ ์ฐจ์งํ๋ ํจ์.......
์ด๋ ๊ฒ ์์ฑ ๊ฐ๋ฅํ๋ค!
const add = (x, y) => x + y;
๐๐ปโโ๏ธ ํ์ดํ ํจ์๋ ํ๊ธฐ๋ฒ์ด ๊ฐ๋จํด์ ์ต๋ช ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊ธธ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
[1, 2, 3, 4, 5].filter(x => x % 2 === 0);`
function hello() {
console.log("hello");
}
hello();
์ด๋ ๊ฒ ํธ์ถํ ์๋ ์์ง๋ง, ํจ์ ์ ์ธํ๊ณ ๋ฐ๋ก ํธ์ถํ ๊ฑฐ๋ผ๋ฉด
(function hello() {
console.log("hello");
})();
โ ์ด๋ ๊ฒ ํจ์ ์ ์ฒด๋ฅผ ()๋ก ๋ฌถ๊ณ , ๊ดํธ ๋ค์์ ํจ์ ํธ์ถํ๋ฏ์ด (); ๋ฅผ ์์ฑํด์ฃผ๋ฉด ์ฆ์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค!
๐ฏ function calculate (command, a, b)
1. command์ ๋ฐ๋ผ a์ b์ ์ซ์๊ฐ์ ๊ฐ์ง๊ณ ๊ณ์ฐ๋๋ ํจ์ ๋ง๋ค๊ธฐ!
2. command : add, subtract, divide, multiply, remainder
๋ด ํ์ด
function calculate(command, a, b) { switch (calculate) { // switch()์ calculate ํจ์๋ช ์ ์จ๋ฒ๋ ธ๋น.. case "add": return a + b; case "subtract": return a - b; case "divide": return a / b; case "multiply": return a * b; case "remainder": return a % b; default: console.log( "add, subtract, divide, multiply, remainder ์ค์์ ์ ๋ ฅํด์ฃผ์ธ์." ); break; } } console.log(calculate("remainder", 44, 5)); // ์ ์ถ๋ ฅ์ด ์๋์ง?
โ switch ๊ตฌ๋ฌธ์ด ์ต์ํ์ง ์์์ ()์ ๋ญ ๋ฃ์์ง ํ์ฐธ ๊ณ ๋ฏผํ๋ค....
calculate ๋ฃ๊ณ ์๋๋๊น ๊ตฌ๊ธ๋ง ํ๋๋ฐ ๊ฒ์์ด๊ฐ ์๋ชป๋๋๊ฑด์ง ๊ธ๋ ์๋์ค๊ณ ใ ใ
โ ์คํ์ด ์๋๋ฉด ์ด๊ฒ์ ๊ฒ ๊ฐ์ ๋ค ๋ฃ์ด๋ณด์ใ
์ ๋ต? ๊ฐ์ ํ ์ฝ๋!
function calculate(command, a, b) { switch (command) { case "add": return a + b; case "subtract": return a - b; case "divide": return a / b; case "multiply": return a * b; case "remainder": return a % b; default: console.log( "add, subtract, divide, multiply, remainder ์ค์์ ์ ๋ ฅํด์ฃผ์ธ์." ); break; } } console.log(calculate("remainder", 44, 5));