๐ 12์ฅ, ํจ์
1
๐ ๋ฐฐ์ด ๋ด์ฉ ๋ฐ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
ํจ์
์๋ฐ์คํฌ๋ฆฝ์์ ๊ฐ์ฅ ์ค์ํ ํต์ฌ ๊ฐ๋
์ผ๋ จ์ ๊ณผ์ ์ ๋ฌธ์ผ๋ก ๊ตฌํํ๊ณ ์ฝ๋ ๋ธ๋ก์ผ๋ก ๊ฐ์ธ์ ํ๋์ ์คํ ๋จ์๋ก ์ ์ ํ ๊ฒ
- ๋งค๊ฐ๋ณ์: ํจ์ ๋ด๋ถ๋ก ์ ๋ ฅ์ ์ ๋ฌ๋ฐ๋ ๋ณ์
- ์ธ์: ์ ๋ ฅ
- ๋ฐํ๊ฐ: ์ถ๋ ฅ
ํจ์๋ ๊ฐ์ด๋ฉฐ, ์ฌ๋ฌ ๊ฐ ์กด์ฌ ํ ์ ์์ผ๋ฏ๋ก ํน์ ํจ์๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ์๋ณ์์ธ ํจ์ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์
ํจ์๋ ์ ์๋ฅผ ํตํด ์์ฑํจ
1 2 3 4 5 6 7 8 9 10
// ํจ์ ์ ์ function add(x, y) { return x + y; } // ํจ์ ํธ์ถ var result = add(2, 5); // ํจ์ add์ ์ธ์ 2, 5๋ฅผ ์ ๋ฌํ๋ฉด์ ํธ์ถํ๋ฉด ๋ฐํ๊ฐ 7์ ๋ฐํํ๋ค. console.log(result); // 7
ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ํจ์๋ ํ์ํ ๋ ์ฌ๋ฌ๋ฒ ํธ์ถ ๊ฐ๋ฅ
- ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ
- ์ ์ง๋ณด์์ ํธ์์ฑ ์ฆ๊ฐ ๋ฐ ์ฝ๋์ ์ ๋ขฐ์ฑ, ๊ฐ๋ ์ฑ ํฅ์
- ๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋๊ฐ ์ข์ ์ฝ๋
ํจ์ ๋ฆฌํฐ๋ด
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ๊ฐ์ฒด ํ์ ์ ๊ฐ
ํจ์ ๋ฆฌํฐ๋ด๋ ํ๊ฐ๋์ด ๊ฐ์ ์์ฑํจ
1 2 3 4
// ๋ณ์์ ํจ์ ๋ฆฌํฐ๋ด์ ํ ๋น var f = function add(x, y) { return x + y; };
ํจ์์ ๊ตฌ์ฑ์์
- ํจ์ ์ด๋ฆ
- ์๋ณ์, ๋ค์ด๋ฐ ๊ท์น ์ค์
- ํจ์ ๋ชธ์ฒด ๋ด์์๋ง ์ฐธ์กฐํ ์ ์๋ ์๋ณ์
- ํจ์ ์ด๋ฆ ์๋ต ๊ฐ๋ฅ. ์ด๋ฆ ์๋ ํจ์-> ๊ธฐ๋ช ํจ์ / ์ด๋ฆ ์๋ ํจ์ -> ๋ฌด๋ช or์ต๋ช ํจ์
- ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก
- 0๊ฐ ์ด์์ ๋งค๊ฐ๋ณ์๋ฅผ ์๊ดํธ๋ก ๊ฐ์ธ๊ณ ์ผํ๋ก ๊ตฌ๋ถ
- ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์๋ ์์์ ์๋ฏธ๊ฐ ์์
- ํจ์ ๋ชธ์ฒด ๋ด์์ ๋ณ์์ ๋์ผํ๊ฒ ์ทจ๊ธ. ๋ค์ด๋ฐ ๊ท์น ์ค์
- ํจ์ ๋ชธ์ฒด
- ํจ์๊ฐ ํธ์ถ๋์์ ๋ ์ผ๊ด์ ์ผ๋ก ์คํ๋ ๋ฌธ๋ค์ ํ๋์ ์คํ๋จ์๋ก ์ ์ํ ์ฝ๋ ๋ธ๋ก
- ํจ์ ํธ์ถ์ ์ํด ์คํ
- ํจ์ ์ด๋ฆ
ํจ์์ ์ผ๋ฐ ๊ฐ์ฒด์ ์ฐจ์ด์
- ์ผ๋ฐ ๊ฐ์ฒด๋ ํธ์ถํ ์ ์์ง๋ง ํจ์๋ ํธ์ถ ๊ฐ๋ฅ
ํจ์ ์ ์
๋ณ์ ์ ์ธ๊ณผ ํจ์ ์ ์
ํจ์ ์ ์ธ๋ฌธ์ด ํ๊ฐ๋๋ฉด ์๋ณ์๊ฐ ์๋ฌต์ ์ผ๋ก ์๋ต๋๊ณ ํจ์ ๊ฐ์ฒด๊ฐ ํ ๋น๋๊ธฐ ๋๋ฌธ์ ๋ณ์๋ ์ ์ธ์ด๋ผ๊ณ ํ๋ฉฐ ํจ์๋ ์ ์๋ผ๊ณ ํ๋ค.
ํจ์ ์ ์ธ๋ฌธ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// ํจ์ ์ ์ธ๋ฌธ 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 // ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ์ด๋ฆ์ ์๋ตํ ์ ์๋ค. function (x, y) { return x + y; } // SyntaxError: Function statements require a function name
ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ์ด๋ฆ์ ์๋ตํ ์ ์์
ํจ์ ์ ์ธ๋ฌธ์ ํํ์์ด ์๋ ๋ฌธ
- ๋๋ฌธ์ ๋ณ์์ ํ ๋น ํ ์ ์์
- ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ ์์ ์ผ๋ก ๋์์ ํจ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋์ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋์ผํ ํจ์ ๋ฆฌํฐ๋ด์ ํํ์์ด ์๋ ๋ฌธ์ธ ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ํด์ํ๋ ๊ฒฝ์ฐ์ ํํ์์ธ ๋ฌธ์ธ ํจ์ ๋ฆฌํฐ๋ด ํํ์์ผ๋ก ํด์ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ
{}
๋ ์ค์์ ์ธ ํํ. ๋ธ๋ก๋ฌธ์ผ ์๋ ์๊ณ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ผ ์๋ ์์. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ฝ๋์ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ํด์์ด ๋ฌ๋ผ์ง{}
์ด ๋จ๋ ์ผ๋ก ์กด์ฌ ํ ๊ฒฝ์ฐ : ๋ธ๋ก์ผ๋ก ํด์- ๊ฐ์ผ๋ก ํ๊ฐ๋์ด์ผํ ๋ฌธ๋งฅ์์ ํผ์ฐ์ฐ์๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ํด์
- ๊ธฐ๋ช ํจ์ ๋ฆฌํฐ๋ด๋ ์ค์์ ์ธ ์ฝ๋. ๋จ๋ ์ผ๋ก ์ฌ์ฉํ๋ฉด ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ํด์ํ๊ณ , ํจ์ ๋ฆฌํฐ๋ด์ ๋ณ์์ ํ ๋นํ๊ฑฐ๋ ํผ์ฐ์ฐ์๋ก ์ฌ์ฉํ๋ฉด ํจ์ ๋ฆฌํฐ๋ด ํํ์์ผ๋ก ํด์
1 2 3 4 5 6 7 8 9
// ๊ธฐ๋ช ํจ์ ๋ฆฌํฐ๋ด์ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ๋ฉด ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ํด์๋๋ค. // ํจ์ ์ ์ธ๋ฌธ์์๋ ํจ์ ์ด๋ฆ์ ์๋ตํ ์ ์๋ค. function foo() { console.log('foo'); } foo(); // foo // ํจ์ ๋ฆฌํฐ๋ด์ ํผ์ฐ์ฐ์๋ก ์ฌ์ฉํ๋ฉด ํจ์ ์ ์ธ๋ฌธ์ด ์๋๋ผ ํจ์ ๋ฆฌํฐ๋ด ํํ์์ผ๋ก ํด์๋๋ค. // ํจ์ ๋ฆฌํฐ๋ด์์๋ ํจ์ ์ด๋ฆ์ ์๋ตํ ์ ์๋ค. (function bar() { console.log('bar'); }); bar(); // ReferenceError: bar is not defined
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์์ฑ๋ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด ํจ์ ์ด๋ฆ๊ณผ ๋์ผํ ์ด๋ฆ์ ์๋ณ์๋ฅผ ์๋ฌต์ ์ผ๋ก ์์ฑํ๊ณ , ๊ฑฐ๊ธฐ์ ํจ์ ๊ฐ์ฒด๋ฅผ ํ ๋น
- ํจ์๋ ํจ์ ์ด๋ฆ์ผ๋ก ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ ํจ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ก ํธ์ถ
ํจ์ ํํ์
ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด
- JS์์ง์์ ํจ์๋ ๊ฐ์ฒ๋ผ ๋ณ์์ ํ ๋น ํ ์ ์๊ณ ํ๋กํผํฐ ๊ฐ์ด ๋ ์ ์์ผ๋ฉฐ ๋ฐฐ์ด์ ์์๊ฐ ๋ ์ ์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// ํจ์ ํํ์ var add = function (x, y) { return x + y; }; console.log(add(2, 5)); // 7 // ๊ธฐ๋ช ํจ์ ํํ์ var add = function foo (x, y) { return x + y; }; // ํจ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ก ํธ์ถ console.log(add(2, 5)); // 7 // ํจ์ ์ด๋ฆ์ผ๋ก ํธ์ถํ๋ฉด ReferenceError๊ฐ ๋ฐ์ํ๋ค. // ํจ์ ์ด๋ฆ์ ํจ์ ๋ชธ์ฒด ๋ด๋ถ์์๋ง ์ ํจํ ์๋ณ์๋ค. console.log(foo(2, 5)); // ReferenceError: foo is not defined
ํจ์ ์์ฑ ์์ ๊ณผ ํธ์ด์คํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ํจ์ ์ฐธ์กฐ
console.dir(add); // ฦ add(x, y)
console.dir(sub); // undefined
// ํจ์ ํธ์ถ
console.log(add(2, 5)); // 7
console.log(sub(2, 5)); // TypeError: sub is not a function
// ํจ์ ์ ์ธ๋ฌธ
function add(x, y) {
return x + y;
}
// ํจ์ ํํ์
var sub = function (x, y) {
return x - y;
};
ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์ํ ํจ์์ ํจ์ ํํ์์ผ๋ก ์ํ ์์ฑ ์์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, ํจ์ ์ ์ธ๋ฌธ์ผ๋ก ์ ์ํ ํจ์๋ ํจ์ ์ ์ธ๋ฌธ ์ด์ ์ ํธ์ถ์ด ๊ฐ๋ฅํ๋ฉฐ ํจ์ํํ์์ผ๋ก ์ ์ํ ํจ์๋ ํจ์ ํํ์ ์ด์ ์ ํธ์ถ ํ ์ ์๋ค
ํจ์ ์ ์ธ๋ฌธ์ ๋ฐํ์ ์ด์ ์ ์คํ
ํจ์ ํธ์ด์คํ
- ํจ์ ์ ์ธ๋ฌธ์ด ์ฝ๋์ ์ ๋๋ก ๋์ด ์ฌ๋ ค์ง ๊ฒ์ฒ๋ผ ๋์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ณ ์ ์ ํน์ง
ํจ์ ํธ์ด์คํ vs ๋ณ์ ํธ์ด์คํ
๊ณตํต์ : ๋ฐํ์ ์ด์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ๋จผ์ ์คํ๋์ด ์๋ณ์๋ฅผ ์์ฑํจ
์ฐจ์ด์ : var ํค์๋๋ฅผ ์ฌ์ฉํ ๋ณ์ ์ ์ธ๋ฌธ ์ด์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด undefined๋ก ํ๊ฐ, ํจ์ ์ ์ธ๋ฌธ ์ด์ ์ ํธ์ถํด๋ ํธ์ถ์ด ๊ฐ๋ฅ
- ๋ณ์ ํ ๋น๋ฌธ๊ณผ ํจ์๋ฆฌํฐ๋ด์ ์ ๋ฐํ์์ ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๊ฐ ๋จ
ํจ์ ํํ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ๋ฉด ํธ์ด์คํ ์ด ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ, ๋ณ์ ํธ์ด์คํ ์ด ๋ฐ์
ํจ์ ํธ์ด์คํ ์ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ฐ๋์ ํจ์๋ฅผ ์ ์ธํด์ผํ๋ค๋ ๊ท์น์ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์, ํจ์ ์ ์ธ๋ฌธ ๋์ ํจ์ ํํ์์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํจ
- ๋๊ธ๋ผ์ค ํฌ๋ฝํฌ๋: JSON์ ์ฐฝ์, โ์๋ฐ์คํฌ๋ฆฝํธ: The Good Partsโ ์ถ๊ฐ
Function ์์ฑ์ ํจ์
1
2
3
var add = new Function('x', 'y', 'return x + y');
console.log(add(2, 5)); // 7
- ์ผ๋ฐ์ ์ด์ง ์์ ๋ฐฉ์
- ํด๋ก์ ๋ฅผ ์์ฑํ์ง ์๊ณ ํจ์ ์ ์ธ๋ฌธ์ด๋ ํจ์ํํ์์ผ๋ก ์์ฑํ ํจ์์ ๋ค๋ฅด๊ฒ ๋์
ํ์ดํ ํจ์
- ES6์์ ๋์๋จ
=>
- ํญ์ ์ต๋ช ํจ์๋ก ์ ์
- ํจ์ ์ ์ธ๋ฌธ ๋๋ ํจ์ ํํ์์ ์์ ํ ๋์ฒด ๋ถ๊ฐ๋ฅ. ํํ๊ณผ ๋ด๋ถ ๋์์ด ๊ฐ๋ตํ
- ์์ฑ์ ํจ์ ์ฌ์ฉ ๋ถ๊ฐ, ๊ธฐ์กด ํจ์์ this ๋ฐ์ธ๋ฉ ๋ฐฉ์์ด ๋ค๋ฆ, prototype ํ๋กํผํฐ ์์, arguments ๊ฐ์ฒด ์์ฑํ์ง ์์
1
2
3
// ํ์ดํ ํจ์
const add = (x, y) => x + y;
console.log(add(2, 5)); // 7
ํจ์ ํธ์ถ
๋งค๊ฐ๋ณ์์ ์ธ์
- ์ธ์๋ ๊ฐ์ผ๋ก ํ๊ฐ๋ ์ ์๋ ํํ์์ด์ด์ผํจ
- ์ธ์๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์ง์ , ๊ฐ์์ ํ์ ์ ์ ํ์ด ์์
1
2
3
4
5
6
7
8
// ํจ์ ์ ์ธ๋ฌธ
function add(x, y) {
return x + y;
}
// ํจ์ ํธ์ถ
// ์ธ์ 1๊ณผ 2๋ ๋งค๊ฐ๋ณ์ x์ y์ ์์๋๋ก ํ ๋น๋๊ณ ํจ์ ๋ชธ์ฒด์ ๋ฌธ๋ค์ด ์คํ๋๋ค.
var result = add(1, 2);
- ๋งค๊ฐ๋ณ์๋ ํจ์๋ฅผ ์ ์ํ ๋ ์ ์ธ, ํจ์ ๋ชธ์ฒด ๋ด๋ถ์์ ๋ณ์์ ๋์ผํ๊ฒ ์ทจ๊ธ
- ํจ์ ๋ชธ์ฒด ๋ด๋ถ์์๋ง ์ฐธ์กฐ ๊ฐ๋ฅ(์ค์ฝํ๋ ํจ์ ๋ด๋ถ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
function add(x, y) {
return x + y; // 2 + undefined ์ ๊ฒฐ๊ณผ ๊ฐ : Not a Number
}
console.log(add(2)); // NaN
์ธ์๊ฐ ๋ถ์กฑํ์ฌ ์ธ์๊ฐ ํ ๋น๋์ง ์์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ undefined
๋งค๊ฐ๋ณ์๋ณด๋ค ์ธ์๊ฐ ๋ ๋ง์ ๊ฒฝ์ฐ ์ด๊ณผ๋ ์ธ์๋ ๋ฌด์๋จ
๋ชจ๋ ์ธ์๋ arguments ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ๋ณด๊ด๋๊ธฐ ๋๋ฌธ์ ์ด๊ณผ๋ ์ธ์๊ฐ ๋ฒ๋ ค์ง๋ ๊ฒ์ ์๋
1 2 3 4 5 6 7 8
function add(x, y) { console.log(arguments); // Arguments(3) [2, 5, 10, callee: ฦ, Symbol(Symbol.iterator): ฦ] return x + y; } add(2, 5, 10);
์ธ์ ํ์ธ
์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ๋งค๊ฐ๋ณ์์ ์ธ์์ ๊ฐ์๊ฐ ์ผ์นํ๋์ง ํ์ธํ์ง ์์
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ ํ์ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ ๋งค๊ฐ๋ณ์์ ํ์ ์ ์ฌ์ ์ ์ง์ ํ ์ ์์
- ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฒฝ์ฐ ํจ์๋ฅผ ์ ์ํ ๋ ์ ์ ํ ์ธ์๊ฐ ์ ๋ฌ๋๋์ง ํ์ธํ ํ์๊ฐ ์์
1
2
3
4
5
6
7
8
9
10
11
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: ์ธ์๋ ๋ชจ๋ ์ซ์ ๊ฐ์ด์ด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ์ ์ ํ์ ์ ์ฌ์ฉํ๋ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ ์์
1
2
3
4
5
6
7
8
9
10
11
12
// ๋จ์ถํ๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ํ ๋นํ๊ธฐ
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
๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ฉด ํจ์ ๋ด์์ ์ํํ๋ ์ธ์ ์ฒดํฌ ๋ฐ ์ด๊ธฐํ๋ฅผ ๊ฐ์ํ ๊ฐ๋ฅํจ
๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ ๋งค๊ฐ๋ณ์์ ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์์ ๊ฒฝ์ฐ์ undefined๋ฅผ ์ ๋ฌํ ๊ฒฝ์ฐ์๋ง ์ ํจ
1 2 3 4 5 6 7 8
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
๋งค๊ฐ๋ณ์์ ์ต๋ ๊ฐ์
๋งค๊ฐ ๋ณ์์ ์ต๋ ๊ฐ์๋ ๋ช ์์ ์ผ๋ก ์ ํํ๊ณ ์์ง ์์ผ๋ฉฐ, ์์์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ธ์์ ์์๋ฅผ ๊ณ ๋ คํด์ผํจ
์ด์์ ์ธ ํจ์๋ ํ ๊ฐ์ง ์ผ๋ง ํด์ผํ๋ฉฐ ๊ฐ๊ธ์ ์๊ฒ ๋ง๋ค์ด์ผ ํจ
๋งค๊ฐ๋ณ์๋ ์ต๋ 3๊ฐ ์ด์ ๋์ง ์๋ ๊ฒ์ ๊ถ์ฅ
๋งค๊ฐ๋ณ์๊ฐ 3๊ฐ ์ด์์ผ ๊ฒฝ์ฐ, ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด ์ ๋ฆฌ
1 2 3 4 5 6 7
// jQuery์ aJax๋ฉ์๋์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ์ $.ajax({ method: 'POST', url: '/user', data: { id: 1, name: 'Lee' }, cache: false });
๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ณ ์ค์๋ ์ค์ด๋ฆ
- ํจ์ ์ธ๋ถ์์ ํจ์ ๋ด๋ถ๋ก ์ ๋ฌํ ๊ฐ์ฒด๋ฅผ ํจ์ ๋ด๋ถ์์ ๋ณ๊ฒฝํ๋ฉด ํจ์ ์ธ๋ถ์ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ ๋ถ์ํจ๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฃผ์๋ฅผ ์ํจ
๋ฐํ๋ฌธ
ํจ์ ํธ์ถ์ ํํ์
๋ฐํ๋ฌธ์ ๋ ๊ฐ์ง ์ญํ ์ ํจ
- ๋ฐํ๋ฌธ์ ํจ์์ ์คํ์ ์ค๋จํ๊ณ ํจ์ ๋ชธ์ฒด๋ฅผ ๋น ์ ธ๋๊ฐ
- return ํค์๋ ๋ค์ ์ค๋ ํํ์์ ํ๊ฐํด ๋ฐํ
- ํํ์์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์์ผ๋ฉด undefined๊ฐ ๋ฐํ
return ๋ค์ ์ธ๋ฏธ์ฝ๋ก (
;
) ์๋ต ๊ฐ๋ฅ1 2 3 4 5 6 7
function multiply(x, y) { // return ํค์๋์ ๋ฐํ๊ฐ ์ฌ์ด์ ์ค๋ฐ๊ฟ์ด ์์ผ๋ฉด return // ์ธ๋ฏธ์ฝ๋ก ์๋ ์ฝ์ ๊ธฐ๋ฅ(ASI)์ ์ํด ์ธ๋ฏธ์ฝ๋ก ์ด ์ถ๊ฐ๋๋ค. x * y; // ๋ฌด์๋๋ค. } console.log(multiply(3, 5)); // undefined
1 2 3 4 5 6 7 8 9
<!-- ์ ์ญ์์ ๋ฐํ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋ฌธ๋ฒ์๋ฌ ๋ฐ์ --> <!DOCTYPE html> <html> <body> <script> return; // SyntaxError: Illegal return statement </script> </body> </html>
์ฐธ์กฐ์ ์ํ ์ ๋ฌ๊ณผ ์ธ๋ถ ์ํ์ ๋ณ๊ฒฝ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ๋งค๊ฐ๋ณ์ primitive๋ ์์ ๊ฐ์ ์ ๋ฌ๋ฐ๊ณ , ๋งค๊ฐ๋ณ์ obj๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
function changeVal(primitive, obj) {
primitive += 100;
obj.name = 'Kim';
}
// ์ธ๋ถ ์ํ
var num = 100;
var person = { name: 'Lee' };
console.log(num); // 100
console.log(person); // {name: "Lee"}
// ์์ ๊ฐ์ ๊ฐ ์์ฒด๊ฐ ๋ณต์ฌ๋์ด ์ ๋ฌ๋๊ณ ๊ฐ์ฒด๋ ์ฐธ์กฐ ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค.
changeVal(num, person);
// ์์ ๊ฐ์ ์๋ณธ์ด ํผ์๋์ง ์๋๋ค.
console.log(num); // 100
// ๊ฐ์ฒด๋ ์๋ณธ์ด ํผ์๋๋ค.
console.log(person); // {name: "Kim"}
- ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ์ถ์ ํ๋ ค๋ฉด Observer ํจํด ๋ฑ์ ํตํด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ๋ ๋ชจ๋ ์ด๋ค์๊ฒ ๋ณ๊ฒฝ์ฌ์ค์ ํต์งํ๊ณ ์ด์ ๋์ฒํ๋ ์ถ๊ฐ ๋์์ด ํ์
- ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ๋ฐฉ๋ฒ ์ค ํ๋๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ณ๊ฐ์ฒด(immutable object)๋ก ๋ง๋ค์ด ์ฌ์ฉ
- ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ ์๋กญ๊ฒ ์์ฑํ๋ ๋น์ฉ์ ๋ค์ง๋ง ๊ฐ์ฒด๋ฅผ ๋ง์น ์์ ๊ฐ์ฒ๋ผ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ผ๋ก ๋ง๋ค์ด ๋์ํ๊ฒ ๋ง๋๋ ๊ฒ
- ๊น์ ๋ณต์ฌ(Deep copy)๋ฅผ ํตํด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฌํ ๋น์ ํ์ฌ ๊ต์ฒด
- ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ธ๋ถ ์ํ์ ์์กดํ์ง ์๋ ํจ์๋ฅผ ์์ํจ์๋ผ๊ณ ํจ
- ๋ถ์ํจ๊ณผ ์ต๋ํ ์ต์ ํ์ฌ ์ค๋ฅ๋ฅผ ํผํ๊ณ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์ด๋ ค๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ํจ
๋ค์ํ ํจ์์ ํํ
์ฆ์ ์คํ ํจ์
ํจ์ ์ ์์ ๋์์ ์ฆ์ ํธ์ถ๋๋ ํจ์
๋จ ํ๋ฒ๋ง ํธ์ถ๋๋ฉฐ ๋ค์ ํธ์ถํ ์ ์์
ํจ์ ์ด๋ฆ์ด ์๋ ์ต๋ช ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์
๊ธฐ๋ช ํจ์๋ก ์ฌ์ฉํด๋ ํจ์ ๋ฆฌํฐ๋ด๋ก ํ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋ค์ ํธ์ถ์ ๋ถ๊ฐ๋ฅ
๋ฐ๋์ ๊ทธ๋ฃน์ฐ์ฐ์(โฆ)๋ก ๊ฐ์ธ์ผํจ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// ์ต๋ช ์ฆ์ ์คํ ํจ์ (function () { var a = 3; var b = 5; return a * b; }()); // ๊ธฐ๋ช ์ฆ์ ์คํ ํจ์ (function foo() { var a = 3; var b = 5; return a * b; }()); foo(); // ReferenceError: foo is not defined
1 2 3 4 5 6 7 8 9
function () { // SyntaxError: Function statements require a function name // ... }(); function foo() { // ... }(); // SyntaxError: Unexpected token ')' function foo() {}(); // => function foo() {};();
๊ทธ๋ฃน ์ฐ์ฐ์๋ก ํจ์๋ฅผ ๋ฌถ๋ ์ด์
๋จผ์ ํจ์ ๋ฆฌํฐ๋ด์ ํ๊ฐํด์ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์
- ๋จผ์ ํจ์ ๋ฆฌํฐ๋ด์ ํ๊ฐํด์ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค๋ฉด ๊ทธ๋ฃน์ฐ์ฐ์ ์ด์ธ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด๋ ์ข์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// ์ฒซ๋ฒ์งธ ๋ฐฉ์์ด ์ ์ผ ์ผ๋ฐ์ ์ธ ๋ฐฉ์ (function () { // ... }()); (function () { // ... })(); !function () { // ... }(); +function () { // ... }();
- ์ฆ์ ์คํ ํจ์ ๋ด์ ์ฝ๋๋ฅผ ๋ชจ์ ๋๋ฉด ๋ณ์๋ ํจ์ ์ด๋ฆ์ ์ถฉ๋์ ๋ฐฉ์งํ ์ ์์
์ฌ๊ท ํจ์
์ฌ๊ทํธ์ถ(recursive call): ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ๊ฒ
์ฌ๊ทํจ์(recursive function): ์ฌ๊ทํธ์ถ์ ์ํํ๋ ํจ์
๋ฐ๋ณต๋๋ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ ๋ฐ๋ณต์ฒ๋ฆฌ function countdown(n) { for (var i = n; i >= 0; i--) console.log(i); } countdown(10); // ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ ๋ฐ๋ณต์ฒ๋ฆฌ function countdown(n) { if (n < 0) return; console.log(n); countdown(n - 1); // ์ฌ๊ท ํธ์ถ } countdown(10);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// ํฉํ ๋ฆฌ์ผ์ ์ฌ๊ทํจ์๋ก ๊ตฌํ // ํฉํ ๋ฆฌ์ผ(๊ณ์น)์ 1๋ถํฐ ์์ ๊น์ง์ ๋ชจ๋ ์์ ์ ์์ ๊ณฑ์ด๋ค. // n! = 1 * 2 * ... * (n-1) * n function factorial(n) { // ํ์ถ ์กฐ๊ฑด: n์ด 1 ์ดํ์ผ ๋ ์ฌ๊ท ํธ์ถ์ ๋ฉ์ถ๋ค. if (n <= 1) return 1; // ์ฌ๊ท ํธ์ถ return n * factorial(n - 1); } console.log(factorial(0)); // 0! = 1 console.log(factorial(1)); // 1! = 1 console.log(factorial(2)); // 2! = 2 * 1 = 2 console.log(factorial(3)); // 3! = 3 * 2 * 1 = 6 console.log(factorial(4)); // 4! = 4 * 3 * 2 * 1 = 24 console.log(factorial(5)); // 5! = 5 * 4 * 3 * 2 * 1 = 120
ํจ์ ์ธ๋ถ์์ ํจ์๋ฅผ ํธ์ถํ ๋๋ ๋ฐ๋์ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ณ์๋ก ํด์ผํจ
์ฌ๊ท ํจ์๋ ์์ ์ ๋ฌดํ ์ฌ๊ท ํธ์ถํ๊ธฐ ๋๋ฌธ์ ํ์ถ ์กฐ๊ฑด์ ๋ฐ๋์ ๋ง๋ค์ด ๋ฉ์ถ ์ ์์ด์ผํจ
- ํ์ถ ์กฐ๊ฑด์ด ์์ผ๋ฉด ํจ์๊ฐ ๋ฌดํ ํธ์ถ๋์ด ์คํ ์ค๋ฒํ๋ก(Stack overflow) ์๋ฌ ๋ฐ์
์ฌ๊ท ํจ์๋ for๋ฌธ์ด๋ while๋ฌธ์ผ๋ก๋ ๊ตฌํ์ด ๊ฐ๋ฅ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
// ์ฌ๊ท ํจ์์ ํจ์ ํํ์ var 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 // ์ฌ๊ท ํจ์๋ฅผ while๋ฌธ์ ์ด์ฉํ์ฌ ๋ง๋ ์ฝ๋ function factorial(n) { if (n <= 1) return 1; var res = n; while (--n) res *= n; return res; } console.log(factorial(0)); // 0! = 1 console.log(factorial(1)); // 1! = 1 console.log(factorial(2)); // 2! = 2 * 1 = 2 console.log(factorial(3)); // 3! = 3 * 2 * 1 = 6 console.log(factorial(4)); // 4! = 4 * 3 * 2 * 1 = 24 console.log(factorial(5)); // 5! = 5 * 4 * 3 * 2 * 1 = 120
์ฌ๊ท ํจ์๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ๋ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฌ์ธ ๋๋ง ํ์ ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํจ
์ค์ฒฉ ํจ์
์ค์ฒฉํจ์(or๋ด๋ถํจ์): ํจ์ ๋ด๋ถ์ ์ ์๋ ํจ์
์ธ๋ถํจ์: ์ค์ฒฉ ํจ์๋ฅผ ํฌํจํ๋ ํจ์
์ค์ฒฉํจ์๋ ์ธ๋ถ ํจ์ ๋ด๋ถ์์๋ง ํธ์ถ ๊ฐ๋ฅ
์ค์ฒฉํจ์๋ ์์ ์ ํฌํจํ๋ ์ธ๋ถํจ์๋ฅผ ๋๋ ํฌํผํจ์์ ์ญํ ์ ํจ
1 2 3 4 5 6 7 8 9 10 11 12 13 14
function outer() { var x = 1; // ์ค์ฒฉ ํจ์ function inner() { var y = 2; // ์ธ๋ถ ํจ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. console.log(x + y); // 3 } inner(); } outer();
์ฝ๋ฐฑ ํจ์
๋ฐ๋ณตํ๋ ์ผ์ ๋ณํ์ง ์๊ณ ๊ณตํต์ ์ผ๋ก ์ํํ์ง๋ง ๋ฐ๋ณตํ๋ฉด์ ํ๋ ์ผ์ ๋ด์ฉ์ ๋ฌ๋ผ ๋งค๋ฒ ํจ์๋ฅผ ์๋กญ๊ฒ ์ ์ํด์ผํ๋ ๋ฌธ์ ๋ก ํจ์๊ฐ ๋ณํ์ง ์๋ ๊ณตํต๋ก์ง์ ๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ๋ก์ง์ ์ํํ ํด์ ํจ์ ์ธ๋ถ์์ ํจ์ ๋ด๋ถ๋ก ์ ๋ฌํ๊ธฐ ์ํด ์ฝ๋ฐฑํจ์ ์ฌ์ฉ
์ฝ๋ฐฑํจ์: ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๋ค๋ฅธ ํจ์์ ๋ด๋ถ๋ก ์ ๋ฌ๋๋ ํจ์
๊ณ ์ฐจํจ์: ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ํจ์์ ์ธ๋ถ์์ ์ฝ๋ฐฑํจ์๋ฅผ ์ ๋ฌ๋ฐ์ ํจ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// ์ธ๋ถ์์ ์ ๋ฌ๋ฐ์ f๋ฅผ n๋งํผ ๋ฐ๋ณต ํธ์ถํ๋ค. function repeat(n, f) { for (var i = 0; i < n; i++) { f(i); // i๋ฅผ ์ ๋ฌํ๋ฉด์ f๋ฅผ ํธ์ถ } } var logAll = function (i) { console.log(i); }; // ๋ฐ๋ณต ํธ์ถํ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค. repeat(5, logAll); // 0 1 2 3 4 var logOdds = function (i) { if (i % 2) console.log(i); }; // ๋ฐ๋ณต ํธ์ถํ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค. repeat(5, logOdds); // 1 3
๊ณ ์ฐจ ํจ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์์ ์ ์ผ๋ถ๋ถ์ผ๋ก ํฉ์ฑ
๊ณ ์ฐจ ํจ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๋ฌ๋ฐ์ ์ฝ๋ฐฑํจ์์ ํธ์ถ์์ ์ ๊ฒฐ์ ํด์ ํธ์ถํจ
- ์ฝ๋ฐฑํจ์๋ ๊ณ ์ฐจํจ์์ ์ํด ํธ์ถ๋๋ฉฐ ๊ณ ์ฐจํจ์๋ ํ์์ ๋ฐ๋ผ ์ฝ๋ฐฑํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์์
์ฝ๋ฐฑ ํจ์๊ฐ ๊ณ ์ฐจ ํจ์ ๋ด๋ถ์๋ง ํธ์ถ๋๋ค๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ต๋ช ํจ์ ๋ฆฌํฐ๋ด๋ก ์ ์ํ๋ฉด์ ๊ณง๋ฐ๋ก ๊ณ ์ฐจ ํจ์์ ์ ๋ฌํ๋ ๊ฒ์ด ์ผ๋ฐ์
1 2 3 4 5
// ์ต๋ช ํจ์ ๋ฆฌํฐ๋ด์ ์ฝ๋ฐฑ ํจ์๋ก ๊ณ ์ฐจ ํจ์์ ์ ๋ฌํ๋ค. // ์ต๋ช ํจ์ ๋ฆฌํฐ๋ด์ repeat ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ํ๊ฐ๋์ด ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. repeat(5, function (i) { if (i % 2) console.log(i); }); // 1 3
์ฝ๋ฐฑ ํจ์๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์๋ฟ ์๋๋ผ, ๋น๋๊ธฐ ์ฒ๋ฆฌ(์ด๋ฒคํธ ์ฒ๋ฆฌ, Ajax ํต์ , ํ์ด๋จธ ํจ์ ๋ฑ)์ ํ์ฉ๋๋ ์ค์ํ ํจํด
๋ฐฐ์ด์ ๊ณ ์ฐจ ํจ์์์๋ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ ๋ฐฐ์ด์ ๊ณ ์ฐจ ํจ์๋ ๋งค์ฐ ์ค์
1 2 3 4 5 6 7 8 9 10 11
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ์ด๋ฒคํธ ์ฒ๋ฆฌ // myButton ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ค. document.getElementById('myButton').addEventListener('click', function () { console.log('button clicked!'); }); // ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ // 1์ด ํ์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค. setTimeout(function () { console.log('1์ด ๊ฒฝ๊ณผ'); }, 1000);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ณ ์ฐจ ํจ์ map var 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
์์ ํจ์์ ๋น์์ ํจ์
- ์์ ํจ์(pure function): ์ด๋ค ์ธ๋ถ ์ํ์ ์์กดํ์ง๋ ์๊ณ ๋ณ๊ฒฝํ์ง๋ ์๋, ์ฆ ๋ถ์ ํจ๊ณผ๊ฐ ์๋ ํจ์
- ๋์ผํ ์ธ์๊ฐ ์ ๋ฌ๋๋ฉด ์ธ์ ๋ ๋์ผํ ๊ฐ์ ๋ฐํ
- ์ค์ง ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ํจ์ ๋ด๋ถ๋ก ์ ๋ฌ๋ ์ธ์์๊ฒ๋ง ์์กดํด ๋ฐํ๊ฐ์ ๋ง๋ฆ
- ํจ์์ ์ธ๋ถ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์
- ์ด๋ค ์ธ๋ถ์ํ์๋ ์์กดํ์ง ์์ผ๋ฉฐ ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง๋ ์๋ ํจ์
๋น์์ ํจ์(impure function): ์ธ๋ถ์ ์ํ์ ์์กดํ๊ฑฐ๋ ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋, ์ฆ ๋ถ์ ํจ๊ณผ๊ฐ ์๋ ํจ์
- ์ธ๋ถ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ํจ์
- ์ธ๋ถ์ํ์ ์์กดํ๋ ํจ์
- ์ธ๋ถ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ์ํจ๊ณผ๊ฐ ์กด์ฌ
- ์ธ๋ถ ์ํ๋ฅผ ์์กดํ๊ฑฐ๋ ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// ์์ํจ์ var count = 0; // ํ์ฌ ์นด์ดํธ๋ฅผ ๋ํ๋ด๋ ์ํ // ์์ ํจ์ increase๋ ๋์ผํ ์ธ์๊ฐ ์ ๋ฌ๋๋ฉด ์ธ์ ๋ ๋์ผํ ๊ฐ์ ๋ฐํํ๋ค. function increase(n) { return ++n; } // ์์ ํจ์๊ฐ ๋ฐํํ ๊ฒฐ๊ณผ๊ฐ์ ๋ณ์์ ์ฌํ ๋นํด์ ์ํ๋ฅผ ๋ณ๊ฒฝ count = increase(count); console.log(count); // 1 count = increase(count); console.log(count); // 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// ๋น์์ ํจ์ var count = 0; // ํ์ฌ ์นด์ดํธ๋ฅผ ๋ํ๋ด๋ ์ํ: increase ํจ์์ ์ํด ๋ณํํ๋ค. // ๋น์์ ํจ์ function increase() { return ++count; // ์ธ๋ถ ์ํ์ ์์กดํ๋ฉฐ ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค. } // ๋น์์ ํจ์๋ ์ธ๋ถ ์ํ(count)๋ฅผ ๋ณ๊ฒฝํ๋ฏ๋ก ์ํ ๋ณํ๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ค์์ง๋ค. increase(); console.log(count); // 1 increase(); console.log(count); // 2
1
โ๏ธ ์ฝ์ ์๊ฐ
ํจ์ ํํธ๋ฅผ ๋ณด๋ฉฐ ์ฝ๋ ์๊ฐ์ด ๋ค๋ฅธ ํํธ๋ณด๋ค ๊ฝค๋ ๊ฑธ๋ ธ๋ค. ๋ด๊ฐ ์ธ์งํ๊ณ ์๋ ํจ์์ ์ค์์ฑ๋ณด๋ค ๋๋์ฑ ์ค์ํ ์ค์ํ๋ค๋ ๊ฒ์ ๋๊ผ๋ค. ํจ์๋ ํธ์ด์คํ ์ด ์ผ์ด๋์ง๋ง ๋ณ์ ํธ์ด์คํ ๊ณผ ๋ค๋ฅด๋ค. ๋ณ์ ํธ์ด์คํ ์ ์ ์ธ๊ณผ ๋์์ undefined๊ฐ ํ ๋น๋์ง๋ง, ํจ์ ํธ์ด์คํ ์ ์ ์ธ๋ฌธ ์ด์ ์ ํธ์ถํด๋ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค. ํจ์ ์ ์ธ๋ฌธ์ ํจ์ ํธ์ด์คํ ์ด ๋์ด ํธ์ถํ ์ ์์ด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์์ ํจ์๋ ๋ฐ๋์ ์ ์ธ๋์ด์ผ ํ๋ค๋ ๊ท์น์์๋ฐ์ด ๋์ด ํจ์ ํํ์์ผ๋ก ์ฌ์ฉํ๋๊ฒ ์ข๋ค๋ ์ ์ ์๊ฒ๋์๋ค. ๋ํ ํ๋์ ํจ์๋ ํ๊ฐ์ง ์ผ์ ํด์ผํ๋ฉฐ, ๋ถ์ํจ๊ณผ๊ฐ ์๋๋ก ํด์ผํ๊ณ ๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ์ ์ ๊ฑฐํด ๋ณต์ก์ฑ์ ์ ๊ฑฐํ์ฌ ๊ฐ๋ ์ฑ๊ณผ ์ค๋ฅ๋ฅผ ํผํด์ผ ํ๋ค๋ ์ค์์ฑ์ ๋ค์๋ ๊นจ๋ฌ๊ฒ ๋์๋ค.
1
โ ๊ถ๊ธํ ๋ด์ฉ์ด๋ ์ ์ดํด๋์ง ์๋ ๋ด์ฉ
- ์์