ํจ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ
์ค์ํ ํต์ฌ์ด๋ค. ํจ์ ๋ง๊ณ ๋ค๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ๋ ์ธ ์ค์ฝํ, ์คํ ์ปจํ ์คํธ , ํด๋ก์ , ์์ฑ์ ํจ์์ ์ํ ๊ฐ์ฒด ์์ฑ , ๋ฉ์๋ , this , ํ๋กํ ํ์ , ๋ชจ๋ํ ๋ฑ ๋๋ถ๋ถ์ ๊ฐ๋ ์ด ํจ์์ ๊น์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ๊ฐ๋ ์ด์ ํต์ฌ๊ฐ๋ ์ธ ํจ์๋ฅผ ์ ์์์ผํ๋ค
ํจ์๋์ ๋ ฅ์ ๋ฐ์์ถ๋ ฅ์ ๋ด๋ณด๋ด๋ ์ผ๋ จ์ ๊ณผ์ ์์ ์ํ ๊ฒ์ด๋ค
๋ค์ ์์ ๋ f(x, y) = x + y๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ก ํํํ ๊ฒ์ด๋ค
// f(x, y) = x + y
function add(x, y) {
return x + y;
}
// f(2, 5) = 7
add(2, 5); // 7
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํจ์๋ ์ผ๋ จ์ ๊ณผ์ ์ ๋ฌธ(statement)์ผ๋ก ๊ตฌํํ๊ณ ์ฝ๋ ๋ธ๋ก์ผ๋ก ๊ฐ์ธ์ ํ๋์ ์คํ ๋จ์๋ก ์ ์ํ ๊ฒ์ด๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํจ์๋ ์
๋ ฅ์ ๋ฐ์์ ์ถ๋ ฅ์ ๋ด๋ณด๋ธ๋ค. ์ด๋
ํจ์ ๋ด๋ถ๋ก ์
๋ ฅ์ ์ ๋ฌ๋ฐ๋ ๋ณ์๋ฅผ ๋งค๊ฐ๋ณ์, ์
๋ ฅ์ ์ธ์ , ์ถ๋ ฅ์ ๋ฐํ๊ฐ์ด๋ผ๊ณ ํ๋ค ๋ํ ํจ์๋ ๊ฐ์ผ๋ก์จ ์ทจ๊ธ์ด ๋๋ค.(์ผ๊ธ๊ฐ์ฒด์ ํน์ง)
๋ค์ ์์ ๋ ํจ์์ ์ ์์ ํธ์ถ์ ํํํ ๊ฒ์ด๋ค.
// ํจ์ ์ ์
function add(x, y) {
return x + y;
}
// ํจ์ ํธ์ถ
var result = add(2, 5);
// ํจ์ add์ ์ธ์ 2, 5๋ฅผ ์ ๋ฌํ๋ฉด์ ํธ์ถํ๋ฉด ๋ฐํ๊ฐ 7์ ๋ฐํํ๋ค.
console.log(result); // 7
ํจ์๋ ํจ์ ์ ์๋ฅผ ํตํด ์์ฑํ๋ค ํ์ง๋ง ํจ์๋ ์ ์๋ง์ผ๋ก ์คํ๋์ง ์๋๋ค.
์ธ์๋ฅผ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ํจ์์ ์ ๋ฌํ๋ฉด์ ํจ์์ ์คํ์ ๋ช
์์ ์ผ๋ก ์ง์ํด์ผ ํ๋ค.
์ด๋ฅผ ํจ์ ํธ์ถ๋ผ๊ณ ํ๋ค.
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ์ ์ฉ
- ์ ์ง๋ณด์์ ํธ์์ฑ์ ๋์
- ์ฝ๋์ ์ ๋ขฐ์ฑ์ ๋์
- ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํฅ์
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋
๊ฐ์ฒด ํ์์๊ฐ์ด๋ค.
๋ฐ๋ผ์ ์ซ์ ๊ฐ์ ์ซ์ ๋ฆฌํฐ๋ด๋ก ์์ฑํ๊ณ , ๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ์์ฑํ๋ ๊ฒ์ฒ๋ผ ํจ์๋ํจ์ ๋ฆฌํฐ๋ด๋ก ์์ฑํ ์ ์๋ค.
(ํจ์ ๋ฆฌํฐ๋ด === ํจ์ ํํ์)
ํจ์ ๋ฆฌํฐ๋ด์ ๊ตฌ์ฑํ๋ ์์
ํจ์ ๋ฆฌํฐ๋ด์ ๊ตฌ์ฑ์์๋ ๋ค์ ํ์ ๊ฐ๋ค
ํจ์ ๋ฆฌํฐ๋ด์ ๊ฐ์ ์์ฑํ๊ธฐ ์ํ ํ๊ธฐ๋ฒ์ด๋ค.
ํจ์ ๋ฆฌํฐ๋ด์ ํ๊ฐ๋์ด ๊ฐ์ ์์ฑํ๊ณ , ์ด ๊ฐ์ ๊ฐ์ฒด๋ค.
ํจ์๋ ๊ฐ์ฒด๋ค.
ํ์ง๋ง ํจ์์ ์ผ๋ฐ ๊ฐ์ฒด๋ ๋ค๋ฅด๋ค.
์ผ๋ฐ ๊ฐ์ฒด๋ ํธ์ถํ ์ ์์ง๋ง, ํจ์๋ ํธ์ถํ ์ ์๋ค.
ํจ์ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ด์ ์
์ธ์๋ฅผ ์ ๋ฌ๋ฐ์๋งค๊ฐ๋ณ์์์คํํ ๋ฌธ๋ค, ๊ทธ๋ฆฌ๊ณ๋ฐํํ ๊ฐ์์ง์ ํ๋ ๊ฒ์ ๋งํ๋ค.
์ ์๋ ํจ์๋ ํ๊ฐ๋์ดํจ์ ๊ฐ์ฒด๊ฐ ๋๋ค.
ํจ์์ ์ ์ ๋ฐฉ๋ฒ
// ํจ์ ์ ์ธ๋ฌธ
function add(x, y) {
return x + y;
}
// ํจ์ ์ฐธ์กฐ
// console.dir์ console.log์๋ ๋ฌ๋ฆฌ ํจ์ ๊ฐ์ฒด์ ํ๋กํผํฐ๊น์ง ์ถ๋ ฅํ๋ค.
// ๋จ, Node.js ํ๊ฒฝ์์๋ console.log์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
console.dir(add); // ฦ add(x, y)
// ํจ์ ํธ์ถ
console.log(add(2, 5)); // 7
ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ๋ฆฌํฐ๋ด๊ณผ ํํ๊ฐ ๋์ผํ๋ค.
ํจ์ ๋ฆฌํฐ๋ด์ ํจ์ ์ด๋ฆ์ ์๋ตํ ์ ์์ผ๋ ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ์ด๋ฆ์ ์๋ตํ ์ ์๋ค.
ํจ์ ์ ์ธ๋ฌธ์ ํํ์์ด ์๋ ๋ฌธ์ด๋ค.
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ฝ์์์ ํจ์ ์ ์ธ๋ฌธ์ ์คํํ๋ฉด ์๋ฃ๊ฐundefined๊ฐ ์ถ๋ ฅ๋๋ค.
ํจ์ ํํ์์ ํํ์์ด ํ๊ฐ๋์ด ์์ฑ๋ ํจ์๊ฐ ์ถ๋ ฅ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ํจ์๋
์ผ๊ธ ๊ฐ์ฒด์ด๋ค.
์ผ๊ธ ๊ฐ์ฒด๋ ๊ฐ์ฒ๋ผ๋ณ์์ ํ ๋นํ ์ ์๊ณ ,ํ๋กํผํฐ ๊ฐ์ด ๋ ์๋ ์์ผ๋ฉฐ,๋ฐฐ์ด์ ์์๋ ๋ ์ ์๋ค.
์ด๋ฌํ ํจ์์ ์ ์ ๋ฐฉ์์ํจ์ ํํ์์ด๋ผ๊ณ ํ๋ค.
// ํจ์ ํํ์
var add = function (x, y) {
return x + y;
};
console.log(add(2, 5)); // 7
ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์ฐจ์ด
ํจ์ ํํ์์ ๋ณ์์ ํ ๋นํ์ฌ ์ฌ์ฉํ๊ธฐ์ ๋ณ์๋ฅผ ํจ์์ฒ๋ผ ์ฌ์ฉํ ์ ์์ด ๋ฐ๋ก ํจ์ ์ด๋ฆ์ด ํ์๊ฐ ์๋ค.
ํ๊ฐ ๋จ๊ณ์์ ํจ์ ๊ฐ์ฒด ์์ฑ.์คํ ๋จ๊ณ์์ ํจ์ ๊ฐ์ฒด ์์ฑ.โํจ์ ํธ์ด์คํ
vs ๋ณ์ ํธ์ด์คํ
varํค์๋๋ฅผ ์ฌ์ฉํ ๋ณ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ์ ์ธ๋ฌธ์ ๋ฐํ์ ์ด์ ์ ์์ง์ ์ํด ๋จผ์ ์คํ๋์ด ์๋ณ์๋ฅผ ์์ฑํ๋ ์ ์ ๋์ผํ๋ค.
ํ์ง๋ง, varํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ undefined๋ก ์ด๊ธฐํ๋๊ณ , ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ๊ฐ์ฒด๋ก ์ด๊ธฐํ ๋๋ค.
๋ฐ๋ผ์, varํค์๋๋ฅผ ์ฌ์ฉํ ๋ณ์๋ ์ ์ธ๋ฌธ ์ด์ ์ ์ฐธ์กฐํ๋ฉด undefined๋ก ํ๊ฐ๋์ง๋ง, ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ํธ์ด์คํ
์ ์ํด ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
โปํจ์ ํํ์
ํจ์ ํํ์์ ๋ณ์์ ํ ๋น๋๋ ๊ฐ์ด ํจ์ ๋ฆฌํฐ๋ด. ์ฆ, ๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ๋ณ์ ์ ์ธ๋ฌธ๊ณผ ํ ๋น๋ฌธ์ ํ๋ฒ์ ๊ธฐ์ ํ ํํ๊ณผ ๋์ผํ๊ฒ ๋์ํ๋ค.
๋ณ์ ์ ์ธ์ ๋ฐํ์ ์ด์ ์ ์คํ๋์ด undefined๋ก ์ด๊ธฐํ ๋๊ณ , ๋ณ์ ํ ๋น๋ฌธ์ด ์คํ๋๋ ์์ , ์ฆ ๋ฐํ์ ์์ ์ ํจ์ ํํ์์ ํจ์ ๋ฆฌํฐ๋ด์ด ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๊ฐ ๋ณ์ ํ ๋น๋ฌธ์ ๊ฐ์ด ๋์ด ํ ๋น๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํจ์ ํํ์์ ํจ์ ํธ์ด์คํ
์ด ๋ฐ์๋์ง ์๊ณ ๋ณ์ ํธ์ด์คํ
๋ง ๋ฐ์๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ธฐ๋ณธ ์ ๊ณตํ๋ ๋นํธ์ธ ํจ์์ธ Function ์์ฑ์ ํจ์์ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก๊ณผ ํจ์ ๋ชธ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ฌํ๋ฉด์ new์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.new์ฐ์ฐ์ ์์ด ํธ์ถํด๋ ๊ฒฐ๊ณผ๋ ๋์ผํ๋ค
var add = new Function('x', 'y', 'return x + y');
console.log(add(2, 5)); // 7
Function์์ฑ์ ํจ์๋ก ํจ์๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ๊ถ์ฅ๋์ง ์๋๋ค ์ด์ ๋ ํด๋ก์ ๊ฐ ์์ฑ๋์ง ์๋๋ค ๋ํ
ํจ์ ์ ์ธ๋ฌธ์ด๋ ํจ์ ํํ์์ผ๋ก ์์ฑํ ํจ์์ ๋ค๋ฅด๊ฒ ๋์ํ๋ค.
ES6์์ ๋์ ๋ ํ์ดํ ํจ์๋ functionํค์๋ ๋์ ํ์ดํ
=>๋ฅผ ์ฌ์ฉํด ๊ฐ๋ตํ ๋ฐฉ๋ฒ์ผ๋ก ํจ์๋ฅผ ์ ์ธํ ์ ์๋ค.
ํ์ดํ ํจ์๋ํญ์ ์ต๋ช ํจ์๋ก ์ ์ํ๋ค.
// ํ์ดํ ํจ์
const add = (x, y) => x + y;
console.log(add(2, 5)); // 7
ํ์ดํ ํจ์๋ ๊ธฐ์กด์ ํจ์๋ณด๋ค ํํ๋ง ๊ฐ๋ตํ ๊ฒ์ด ์๋๋ผ ๋ด๋ถ ๋์ ๋ํ ๊ฐ๋ตํ๋์ด ์๋ค.
this ๋ฐ์ธ๋ฉ ๋ฐฉ์์ด ๋ค๋ฅด๋ค
prototype ํ๋กํผํฐ๊ฐ ์๋ค
arguments ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๋๋ค
ํจ์๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์์ ํ ์์
์๊ดํธ()์ธ ํจ์ ํธ์ถ ์ฐ์ฐ์๋ก ํธ์ถํ๋ค.
ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ์ ์คํ ํ๋ฆ์ ์ค๋จํ๊ณ ํธ์ถ๋ ํจ์๋ก ์คํ ํ๋ฆ์ ์ฎ๊ธด๋ค. ์ด๋ ๋งค๊ฐ๋ณ์์ ์ธ์๊ฐ ์์๋๋ก ํ ๋น๋๊ณ ํจ์ ๋ชธ์ฒด์ ๋ฌธ๋ค์ด ์คํ๋๊ธฐ ์์ํ๋ค.
// ํจ์ ์ ์ธ๋ฌธ
function add(x, y) {
return x + y;
}
// ํจ์ ํธ์ถ
// ์ธ์ 1๊ณผ 2๋ ๋งค๊ฐ๋ณ์ x์ y์ ์์๋๋ก ํ ๋น๋๊ณ ํจ์ ๋ชธ์ฒด์ ๋ฌธ๋ค์ด ์คํ๋๋ค.
let result = add(1, 2);
ํจ์ ๋งค๊ฐ๋ณ์์ ์ค์ฝํ๋ ํจ์ ๋ด๋ถ์ด๋ค.
๋ฐ๋ผ์ ํจ์ ๋ฐ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐพ์ผ๋ ค๊ณ ํ๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค
function add(x, y) {
console.log(x, y); // 2 5
return x + y;
}
add(2, 5);
// add ํจ์์ ๋งค๊ฐ๋ณ์ x, y๋ ํจ์ ๋ชธ์ฒด ๋ด๋ถ์์๋ง ์ฐธ์กฐํ ์ ์๋ค.
console.log(x, y); // ReferenceError: x is not defined
ํจ์ ๋งค๊ฐ๋ณ์์ ๊ฐ์์ ์ธ์์ ๊ฐ์๊ฐ ์ผ์นํ์ง ์์๋ ๋๋ค.
์ธ์๊ฐ ๋ถ์กฑํ๋ฉด ํ ๋น๋์ง ์์ ๋งค๊ฐ๋ณ์๋ undefined์ด๊ณ ๋์น๋ ๊ฒฝ์ฐ ๋ฌด์๋๋ค. ์ด๊ณผ๋๋๊ฒฝ์ฐ ๋ฒ๋ ค์ง๋๊ฒ์ ์๋๊ณ arguments๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ๋ณด๊ด๋๋ค.
function add(x, y) {
return x + y;
}
console.log(add(2)); // NaN = 2 + undefined
console.log(add(2,3,4)) // 5
// ์ด๊ณผ๋ ๋ฒ๋ ค์ง์ง ์๊ณ ๋ณด๊ด๋๋ค.
function add(x, y) {
console.log(arguments);
// Arguments(3) [2, 5, 10, callee: ฦ, Symbol(Symbol.iterator): ฦ]
return x + y;
}
add(2, 5, 10);
- ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ๋งค๊ฐ๋ณ์์ ์ธ์์ ๊ฐ์๊ฐ ์ผ์นํ๋์ง ํ์ธํ์ง ์๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ ํ์ ์ธ์ด๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ๋งค๊ฐ๋ณ์์ ํ์ ์ ์ฌ์ ์ ์ง์ ํ ์ ์๋ค.
์์ ๊ฐ์ ์ด์ ๋ก ํจ์๋ฅผ ์ ์ํ ๋ ์ ์ ํ ์ธ์๊ฐ ์ ๋ฌ๋์๋์ง ํ์ธ์ด ํ์ํ๋ค.
typeof๋ก ํ์ธํ๋๋ฐฉ๋ฒํ์
์คํฌ๋ฆฝํธ๊ฐ์ ์ ์ ํ์
์ ํ์ธํ ์ ์๋ ์์ ํ์ฅ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค.function add(x, y) {
if (typeof x !== 'number' || typeof y !== 'number') {
// ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๋ฌ๋ ์ธ์์ ํ์
์ด ๋ถ์ ์ ํ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
throw new TypeError('์ธ์๋ ๋ชจ๋ ์ซ์ ๊ฐ์ด์ด์ผ ํฉ๋๋ค.');
}
return x + y;
}
console.log(add(2)); // TypeError: ์ธ์๋ ๋ชจ๋ ์ซ์ ๊ฐ์ด์ด์ผ ํฉ๋๋ค.
console.log(add('a', 'b')); // TypeError: ์ธ์๋ ๋ชจ๋ ์ซ์ ๊ฐ์ด์ด์ผ ํฉ๋๋ค.
2.๋จ์ถํ๊ฐ๋ฅผ ํ์ฉํด ๊ธฐ๋ณธ๊ฐ ํ ๋น
function add(a, b, c) {
a = a || 0;
b = b || 0;
c = c || 0;
return a + b + c;
}
console.log(add(1, 2, 3)); // 6
console.log(add(1, 2)); // 3
console.log(add(1)); // 1
console.log(add()); // 0
3.ES6์ ๋์ ๋ ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ธฐ
function add(a = 0, b = 0, c = 0) {
return a + b + c;
}
console.log(add(1, 2, 3)); // 6
console.log(add(1, 2)); // 3
console.log(add(1)); // 1
console.log(add()); // 0
- ECMAScript ์ฌ์์๋ ๋งค๊ฐ๋ณ์์ ์ต๋ ๊ฐ์์ ๋ํด ๋ช ์์ ์ผ๋ก ์ ํํ์ง ์๋๋ค.
- ๊ฐ์ฅ ์ด์์ ์ธ ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ 0๊ฐ ์ด๋ค.
- ๋งค๊ฐ๋ณ์๋ ์์์ ์๋ฏธ๊ฐ ์๋ค.
- ๊ฐ์๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ์ ์ง๋ณด์์ฑ์ด ๋๋น ์ง๋ค.
- ์ต๋ 3๊ฐ ์ด์์ ๋์ง ์๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
- ๋ง์ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค.
jQuery์ ajax์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ์์ ์ฝ๋
$.ajax({
method: 'POST',
url: '/user',
data: { id: 1, name: 'Lee' },
cache: false
});
ํจ์ ์ธ๋ถ์์ ํจ์ ๋ด๋ถ๋ก ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ ํจ์ ๋ด๋ถ์์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ธ๋ถ์ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ ๋ถ์ํจ๊ณผ๊ฐ ๋ฐ์๋๋ ์ฃผ์ํด์ผํ๋ค.
ํจ์๋
returnํค์๋์ ํํ์(๋ฐํ๊ฐ)์ผ๋ก ์ด๋ค์ง ๋ฐํ๋ฌธ์ ์ฌ์ฉํด ์คํ ๊ฒฐ๊ณผ๋ฅผ ํจ์ ์ธ๋ถ๋ก ๋ฐํํ ์ ์๋ค.
function multiply(x, y) {
return x * y; // ๋ฐํ๋ฌธ
}
// ํจ์ ํธ์ถ์ ๋ฐํ๊ฐ์ผ๋ก ํ๊ฐ๋๋ค.
let result = multiply(3, 5);
console.log(result); // 15
ํจ์ ํธ์ถ์ ํํ์์ด๋ค.
ํจ์ ํํ์์ returnํค์๋๊ฐ ๋ฐํํ ํํ์์ ํ๊ฐ ๊ฒฐ๊ณผ, ์ฆ ๋ฐํ๊ฐ์ผ๋ก ํ๊ฐ๋๋ค.
๋ฐํ๋ฌธ์ ์ญํ
returnํค์๋ ๋ค์ ์ค๋ ํํ์์ ํ๊ฐํด์ ๋ฐํํ๋ฉฐ return์ ํํ์์ด ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํ๋ค undefined๋ฅผ ๋ฐํํ๋คfunction multiply(x, y) {
return x * y; // ๋ฐํ๋ฌธ
// 1.๋ฐํ๋ฌธ ์ดํ์ ๋ค๋ฅธ ๋ฌธ์ด ์กด์ฌํ๋ฉด ๊ทธ ๋ฌธ์ ์คํ๋์ง ์๊ณ ๋ฌด์๋๋ค.
console.log('์คํ๋์ง ์๋๋ค.');
}
console.log(multiply(3, 5)); // 15
// 2.ํํ์์ด ์์ผ๋ฉด undefined ๋ฐํํ๋ค
function foo () {
return;
}
console.log(foo()); // undefined
// 3.๋ฐํ๋ฌธ์ ์๋ตํ ์ undefined๊ฐ ๋ฐํ๋๋ค
function foo () {
// ๋ฐํ๋ฌธ์ ์๋ตํ๋ฉด ์๋ฌต์ ์ผ๋ก undefined๊ฐ ๋ฐํ๋๋ค.
}
console.log(foo()); // undefined
์์ ๊ฐ๊ณผ ๊ฐ์ฒด์ ๋น๊ตโ์์ ์ดํด ๋ดค๋ฏ์ด ์์๊ฐ์ ๊ฐ์ ์ํ ์ ๋ฌ, ๊ฐ์ฒด๋ ์ฐธ์กฐ์ ์ํ ์ ๋ฌ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
ํจ์์ ๋งค๊ฐ๋ณ์๋ ๋์ผํ๋ค.
// ๋งค๊ฐ๋ณ์ primitive๋ ์์๊ฐ์ ์ ๋ฌ๋ฐ๊ณ , ๋งค๊ฐ๋ณ์ obj๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
function changeVal(primitive, obj) {
primitive += 100;
obj.name = 'Kim';
}
// ์ธ๋ถ ์ํ
let num = 100;
let person = { name: 'Lee' };
console.log(num); // 100
console.log(person); // {name: "Lee"}
// ์์๊ฐ์ ๊ฐ ์์ฒด๊ฐ ๋ณต์ฌ๋์ด ์ ๋ฌ๋๊ณ ๊ฐ์ฒด๋ ์ฐธ์กฐ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค.
changeVal(num, person);
// ์์๊ฐ์ ์๋ณธ์ด ํผ์๋์ง ์๋๋ค.
console.log(num); // 100
// ๊ฐ์ฒด๋ ์๋ณธ์ด ํผ์๋๋ค.
console.log(person); // {name: "Kim"}
์ ์์ ์ ๊ฐ์ด person๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ฉด ํจ์ ๋ด๋ถ์์ ์ด๋ฅผ ์์ ํ ๊ฒฝ์ฐ ์๋ณธ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋๋ถ์ ํจ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
์์๊ฐ์ ๊ฐ์ ๋ณต์ฌํด ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ํฅ์ด ์๋ค
ํจ์์ ์ ์์ ๋์์ ์ฆ์ ํธ์ถ๋๋ ํจ์(IIFE Immediately Invoked Function Expression)
๋จ ํ ๋ฒ๋ง ํธ์ถ๋๋ฉฐ ๋ค์ ํธ์ถํ ์ ์๋ค.
// ์ต๋ช
์ฆ์ ์คํ ํจ์
(function () {
let a = 3;
let b = 5;
return a * b;
}());
// ๊ธฐ๋ช
์ฆ์ ์คํ ํจ์
(function foo() {
let a = 3;
let b = 5;
return a * b;
}());
foo(); // ReferenceError: foo is not defined
์ต๋ช
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง ๊ธฐ๋ช
ํจ์๋ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฃน์ฐ์ฐ์()๋ด์ ๊ธฐ๋ช
ํจ์๋ ํจ์ ์ ์ธ๋ฌธ์ด ์๋๋ผ ํจ์ ๋ฆฌํฐ๋ด๋ก ํ๊ฐ๋๋ฉฐ ํจ์ ์ด๋ฆ์ ํจ์ ๋ชธ์ฒด์์๋ง ์ฐธ์กฐ๊ฐ๋ฅํ์ฌ ํธ์ถํ ์ ์๋ค.
์ฆ์ ์คํ ํจ์๋ ๋ฐ๋์ ๊ทธ๋ฃน ์ฐ์ฐ์ ()๋ก ๊ฐ์ธ์ผ ํ๋ค.
์ฆ์ ์คํ ํจ์๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ๊ฐ์ ๋ฐํํ๊ณ ์ธ์๋ ์ ๋ฌ ํ๋ค.
// ์ฆ์ ์คํ ํจ์๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ๊ฐ์ ๋ฐํํ ์ ์๋ค.
let res = (function () {
let a = 3;
let b = 5;
return a * b;
}());
console.log(res); // 15
// ์ฆ์ ์คํ ํจ์์๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์๋ค.
res = (function (a, b) {
return a * b;
}(3, 5));
console.log(res); // 15
ํจ์๊ฐ
์๊ธฐ ์์ ์ ํธ์ถํ๋ ๊ฒ์ ์ฌ๊ท ํธ์ถ์ด๋ผ๊ณ ํ๋ค.
function countdown(n) {
if (n < 0) return;
console.log(n);
countdown(n - 1); // ์ฌ๊ท ํธ์ถ
}
countdown(10);
// ํจ์ ํํ์
let factorial = function foo(n) {
// ํ์ถ ์กฐ๊ฑด: n์ด 1 ์ดํ์ผ ๋ ์ฌ๊ท ํธ์ถ์ ๋ฉ์ถ๋ค.
if (n <= 1) return 1;
// ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ก ์๊ธฐ ์์ ์ ์ฌ๊ท ํธ์ถ
return n * factorial(n - 1);
// ํจ์ ์ด๋ฆ์ผ๋ก ์๊ธฐ ์์ ์ ์ฌ๊ท ํธ์ถํ ์๋ ์๋ค.
// console.log(factorial === foo); // true
// return n * foo(n - 1);
};
console.log(factorial(5)); // 5! = 5 * 4 * 3 * 2 * 1 = 120
ํจ์ ์๋ณ์๋ factorial์ด์ง๋ง ํจ์ ๋ด๋ถ์์๋ ํจ์ ์ด๋ฆfoo๋ฅผ ์ฌ์ฉํด ํธ์ถํ ์ ์๋ค. ๋น์ฐํ ํจ์ ์๋ณ์factorial๋ก๋ ํจ์ ๋ด๋ถ์์ ํธ์ถ ๊ฐ๋ฅํ๋ค.
์ค์ฒฉ ํจ์(nested function)๋๋ ๋ด๋ถ ํจ์(inner function)๋ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ฒฉ ํจ์๋ฅผ ํฌํจํ๋ ํจ์๋ ์ธ๋ถ ํจ์(outer function)๋ผ ํ๋ค.
function outer() {
let x = 1;
// ์ค์ฒฉ ํจ์
function inner() {
let y = 2;
// ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
console.log(x + y); // 3
}
inner();
}
outer();
ES6๋ถํฐ๋ ํจ์ ์ ์ธ๋ฌธ์ if๋ฌธ์ด๋ for๋ฌธ ๋ฑ์ ์ฝ๋ ๋ธ๋ก ๋ด์์๋ ์ ์ํ ์ ์๋ค.
๋จ ํธ์ด์คํ
์ผ๋ก ์ธํด ํผ๋์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๋ฐ๋์งํ์ง ์๋ค.
์ค์ฒฉ ํจ์๋ ํด๋ก์ ์ ๊ด๋ จ์ด ์๋ค.
ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด
๋ค๋ฅธ ํจ์์ ๋ด๋ถ๋ก ์ ๋ฌ๋๋ ํจ์๋ฅผ์ฝ๋ฐฑ ํจ์๋ผ๊ณ ํ๋ค.
๋งค๊ฐ๋ณ์๋ฅผ ํตํด ํจ์์์ธ๋ถ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ๊ณ ์ฐจ ํจ์๋ผ๊ณ ํ๋ค.
// ์ธ๋ถ์์ ์ ๋ฌ๋ฐ์ f๋ฅผ n๋งํผ ๋ฐ๋ณต ํธ์ถํ๋ค
function repeat(n, f) {
for (let i = 0; i < n; i++) {
f(i); // i๋ฅผ ์ ๋ฌํ๋ฉด์ f๋ฅผ ํธ์ถ
}
}
let logAll = function (i) {
console.log(i);
};
// ๋ฐ๋ณต ํธ์ถํ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค.
repeat(5, logAll); // 0 1 2 3 4
let logOdds = function (i) {
if (i % 2) console.log(i);
};
// ๋ฐ๋ณต ํธ์ถํ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค.
repeat(5, logOdds); // 1 3
โ๊ณ ์ฐจํจ์
์ต๋ช ํจ์ ๋ฆฌํฐ๋ด๋ก ์ ์ํ๋ฉด์ ๋ฐ๋ก ๊ณ ์ฐจ ํจ์์ ์ ๋ฌํ๋๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค
// ์ต๋ช
ํจ์ ๋ฆฌํฐ๋ด์ ์ฝ๋ฐฑ ํจ์๋ก ๊ณ ์ฐจ ํจ์์ ์ ๋ฌํ๋ค.
// ์ต๋ช
ํจ์ ๋ฆฌํฐ๋ด์ repeat ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
repeat(5, function (i) {
if (i % 2) console.log(i);
}); // 1 3
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์๋ฟ๋ง ์๋๋ผ ๋น๋๊ธฐ ์ฒ๋ฆฌ(์ด๋ฒคํธ, Ajaxํต์ , ํ์ด๋จธํจ์ ๋ฑ)์ ํ์ฉ๋๋ ์ค์ํ ํจํด์ด๋ค.
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ์ด๋ฒคํธ ์ฒ๋ฆฌ
// myButton ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ค.
document.getElementById('myButton').addEventListener('click', function () {
console.log('button clicked!');
});
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ
// 1์ด ํ์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค.
setTimeout(function () {
console.log('1์ด ๊ฒฝ๊ณผ');
}, 1000);
๋ชจ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ๊ณ ์ฐจ ํจ์์ ์ํด ํธ์ถ๋๋ ๊ฒ์ ์๋๋ค. setTimeoutํจ์์ ์ฝ๋ฐฑ ํจ์๋ setTimeoutํจ์๊ฐ ํธ์ถํ์ง ์๋๋ค.
๋ฐฐ์ด ๊ณ ์ฐจ ํจ์ ์์
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ณ ์ฐจ ํจ์ map
let res = [1, 2, 3].map(function (item) {
return item * 2;
});
console.log(res); // [2, 4, 6]
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ณ ์ฐจ ํจ์ filter
res = [1, 2, 3].filter(function (item) {
return item % 2;
});
console.log(res); // [1, 3]
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ณ ์ฐจ ํจ์ reduce
res = [1, 2, 3].reduce(function (acc, cur) {
return acc + cur;
}, 0);
console.log(res); // 6

์์ ํจ์ ์์
let count = 0; // ํ์ฌ ์นด์ดํธ๋ฅผ ๋ํ๋ด๋ ์ํ
// ์์ ํจ์ increase๋ ๋์ผํ ์ธ์๊ฐ ์ ๋ฌ๋๋ฉด ์ธ์ ๋ ๋์ผํ ๊ฐ์ ๋ฐํํ๋ค.
function increase(n) {
return ++n;
}
// ์์ ํจ์๊ฐ ๋ฐํํ ๊ฒฐ๊ณผ๊ฐ์ ๋ณ์์ ์ฌํ ๋นํด์ ์ํ๋ฅผ ๋ณ๊ฒฝ
count = increase(count);
console.log(count); // 1
count = increase(count);
console.log(count); // 2
์์ํจ์์ ํน์ง
๋ถ์์ฉ์ด ์๋ค
-์์ ํจ์๋ ์ธ๋ถ ๋ณ์์ ์ข
์๋์ง ์์ผ๋ฉฐ, ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์์ ํจ์๋ ๋ถ์์ฉ์ด ์๋ ํจ์์ด๋ค.
์
๋ ฅ๋ง์ด ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น๋ค
-๋์ผํ ์
๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.์ฆ, ํจ์์ ๊ฒฐ๊ณผ๋ ์ค๋ก์ง ์
๋ ฅ ๊ฐ์ ์์กดํ๋ฉฐ, ์ธ๋ถ ์ํ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
๊ฐ๋ณ์ฑ์ด ์๋ค
-ํจ์ ๋ด๋ถ์์ ๊ฐ๋ณ์ ์ธ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค. ์ฆ, ํจ์๊ฐ ์คํ๋๋ ๋์ ๋ด๋ถ ์ํ๊ฐ ๋ณํ์ง ์๋๋ค.
์ฐธ์กฐ ํฌ๋ช
์ฑ
-์ฐธ์กฐ ํฌ๋ช
์ฑ์ด๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ ํจ์๋ฅผ ํธ์ถํ๋ ์์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง์ง ์๋ ํน์ฑ์ ์๋ฏธํ๋ค.
๋น์์ ํจ์ ์์
let count = 0; // ํ์ฌ ์นด์ดํธ๋ฅผ ๋ํ๋ด๋ ์ํ: increase ํจ์์ ์ํด ๋ณํํ๋ค.
// ๋น์์ ํจ์
function increase() {
return ++count; // ์ธ๋ถ ์ํ์ ์์กดํ๋ฉฐ ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
}
// ๋น์์ ํจ์๋ ์ธ๋ถ ์ํ(count)๋ฅผ ๋ณ๊ฒฝํ๋ฏ๋ก ์ํ ๋ณํ๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ค์์ง๋ค.
increase();
console.log(count); // 1
increase();
console.log(count); // 2
๋น์์ ํจ์์ ํน์ง
๋ถ์์ฉ์ด ์๋ค
๋น์์ ํจ์๋ ์ธ๋ถ ๋ณ์์ ์์กดํ๊ฑฐ๋, ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฑ ๋ถ์์ฉ์ด ๋ฐ์ํ ์ ์๋ค. ํ์ผ ์์คํ
์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ์ธ๋ถ ์์์ ์ ๊ทผํ ์ ์๋ค.
์
๋ ฅ ์ด์ธ์ ์์์ ์์กด
ํจ์์ ๊ฒฐ๊ณผ๋ ์
๋ ฅ๋ฟ๋ง ์๋๋ผ ์ธ๋ถ ์ํ๋ ์๊ฐ ๋ฑ ๋ค์ํ ์์์ ์ํฅ์ ๋ฐ์ ์ ์๋ค.
๊ฐ๋ณ์ฑ์ ํฌํจํ ์ ์๋ค.
ํจ์ ๋ด๋ถ์์ ๊ฐ๋ณ์ ์ธ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ์ด๋ ์ ์ญ ๋ณ์์ ์์ ๋๋ ์ธ๋ถ ์์์ ๋ณ๊ฒฝ์ ํฌํจํ ์ ์๋ค.
๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ผ๋ฉด ๋น์์ ํจ์๊ฐ ๋๋ค.
์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ์ํจ๊ณผ๋ฅผ ์ต์ํํด์ ๋ถ๋ณ์ฑ์ ์งํฅํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์ ํจ์๋ฅผ ํตํด ๋ถ์ ํจ๊ณผ๋ฅผ ์ต๋ํ ์ต์ ํ์ฌ ์ค๋ฅ๋ฅผ ํผํ๊ณ , ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ด๋ ๋
ธ๋ ฅ์ ์ผํ์ด๋ค.