π λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ΅μ¬) 12μ₯. ν¨μ
01. ν¨μλ?
ν¨μλ μλ°μ€ν¬λ¦½νΈμμ κ°μ₯ μ€μν ν΅μ¬ κ°λ μ΄λ€.
μΌλ ¨μ κ³Όμ μ λ¬Έ(statement)μΌλ‘ ꡬννκ³ μ½λ λΈλ‘μΌλ‘ κ°μΈμ νλμ μ€ν λ¨μλ‘ μ μν κ²μ΄λ€.
- λ§€κ° λ³μ : ν¨μ λ΄λΆλ‘ μ λ¬ λ°λ λ³μ
- μΈμ : μ λ ₯
- λ°νκ° : μΆλ ₯
π‘ ν¨μ νΈμΆ
β‘οΈ μΈμλ₯Ό λ§€κ°λ³μλ₯Ό ν΅ν΄ ν¨μμ μ λ¬νλ©΄μ ν¨μμ μ€νμ λͺ μμ μΌλ‘ μ§μνλ κ²
β‘οΈ ν¨μλ₯Ό νΈμΆνλ©΄ μ½λ λΈλ‘μ λ΄κΈ΄ λ¬Έλ€μ΄ μΌκ΄μ μΌλ‘ μ€νλκ³ , μ€ν κ²°κ³Ό, μ¦ λ°νκ°μ λ°ννλ€.
π₯οΈ μμ μ½λ
// ν¨μ μ μ
function add(x, y) {
return x + y;
}
// ν¨μ νΈμΆ
var result = add(2, 5);
// ν¨μ addμ μΈμ 2, 5λ₯Ό μ λ¬νλ©΄μ νΈμΆνλ©΄ λ°νκ° 7μ λ°ννλ€.
console.log(result); // 7
02. ν¨μλ₯Ό μ¬μ©νλ μ΄μ
- μ½λμ μ¬μ¬μ©
- μ μ§λ³΄μμ νΈμμ± μ¦κ°
- μ½λμ μ λ’°μ± μ¦κ°
- μ½λμ κ°λ μ± ν₯μ
03. ν¨μ 리ν°λ΄
μλ°μ€ν¬λ¦½νΈμ ν¨μλ κ°μ²΄ νμ μ κ°μ΄λ€.
ν¨μ 리ν°λ΄μ function ν€μλ, ν¨μ μ΄λ¦, λ§€κ° λ³μ λͺ©λ‘, ν¨μ λͺΈμ²΄λ‘ ꡬμ±λλ€.
π₯οΈ μμ μ½λ
// λ³μμ ν¨μ 리ν°λ΄μ ν λΉ
var f = function add(x, y) {
return x + y;
};
π‘ ν¨μκ° κ°μ²΄λΌλ μ¬μ€μ λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μ ꡬλ³λλ μλ°μ€ν¬λ¦½νΈμ μ€μν νΉμ§μ΄λ€.
04. ν¨μ μ μ
ν¨μλ₯Ό νΈμΆνκΈ° μ΄μ μ μΈμλ₯Ό μ λ¬λ°μ λ§€κ°λ³μμ μ€νν λ¬Έλ€, κ·Έλ¦¬κ³ λ°νν κ°μ μ§μ νλ κ²μ λ§νλ€.
ν¨μλ₯Ό μ μνλ λ°©λ²(4κ°μ§)λ₯Ό μμ보μ.
- ν¨μ μ μΈλ¬Έ
- ν¨μ ννμ
- Function μμ±μ ν¨μ
- νμ΄ν ν¨μ(ES6)
1) ν¨μ μ μΈλ¬Έ
π₯οΈ μμ μ½λ
// 1. ν¨μ μ μΈλ¬Έ
function add(x, y) {
return x + y;
}
// ν¨μ μ°Έμ‘°
console.dir(add); // f add(x, y)
// ν¨μ νΈμΆ
console.log(add(2, 5)); // 7
β‘οΈ ν¨μ μ μΈλ¬Έμ ν¨μ 리ν°λ΄κ³Ό ννκ° λμΌνλ€.
β οΈ ν¨μ 리ν°λ΄ : ν¨μ μ΄λ¦ μλ΅ κ°λ₯
β οΈ ν¨μ μ μΈλ¬Έ : ν¨μ μ΄λ¦ μλ΅ λΆκ°λ₯
π‘ μλ°μ€ν¬λ¦½νΈ μμ§μ μμ±λ ν¨μλ₯Ό νΈμΆνκΈ° μν΄ ν¨μ μ΄λ¦κ³Ό λμΌν μ΄λ¦μ μλ³μλ₯Ό μ묡μ μΌλ‘ μμ±νκ³ , κ±°κΈ°μ ν¨μ κ°μ²΄λ₯Ό ν λΉνλ€.
2) ν¨μ ννμ
μλ°μ€ν¬λ¦½νΈμ ν¨μλ μΌκΈ κ°μ²΄λ€.
β» ν¨μλ₯Ό κ°μ²λΌ μμ λ‘κ² μ¬μ©ν μ μλ€λ μλ―Έλ€!
π₯οΈ μμ μ½λ
// 2. ν¨μ ννμ
var add = function(x, y) {
return x + y;
};
console.log(add(2, 5)); // 7
3) ν¨μ μμ± μμ κ³Ό ν¨μ νΈμ΄μ€ν
π₯οΈ μμ μ½λ
// ν¨μ μ°Έμ‘°
console.dir(add); // f 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;
};
β‘οΈ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μμ ν¨μ ννμμΌλ‘ μ μν ν¨μμ μμ± μμ μ΄ λ€λ₯΄λ€.
β» ν¨μ νΈμ΄μ€ν : ν¨μ μ μΈλ¬Έμ΄ μ½λμ μ λλ‘ λμ΄ μ¬λ €μ§ κ²μ²λΌ λμνλ μλ°μ€ν¬λ¦½νΈ κ³ μ μ νΉμ§
β» ν¨μ ννμμΌλ‘ ν¨μλ₯Ό μ μνλ©΄ ν¨μ νΈμ΄μ€ν (X), λ³μ νΈμ΄μ€ν (O)
π‘ ν¨μ ννμμΌλ‘ μ μν ν¨μ -> λ°λμ ν¨μ ννμ μ΄νμ μ°Έμ‘° λλ νΈμΆν΄μΌ νλ€.
4) Function μμ±μ ν¨μ
π₯οΈ μμ μ½λ
// 3. Function μμ±μ ν¨μ
var add = new Function('x', 'y', 'return x + y');
console.log(add(2, 5)); // 7
Function μμ±μ ν¨μλ‘ ν¨μλ₯Ό μμ±νλ λ°©μμ μΌλ°μ μ΄μ§ μμΌλ©° λ°λμ§νμ§λ μλ€.
5) νμ΄ν ν¨μ
π₯οΈ μμ μ½λ
// 4. νμ΄ν ν¨μ(ES6)
const add = (x, y) => x + y;
console.log(add(2, 5)); // 7
05. ν¨μ νΈμΆ
1) λ§€κ°λ³μμ μΈμ
π₯οΈ μμ μ½λ
// ν¨μ μ μΈλ¬Έ
function add(x, y) {
return x + y;
}
// ν¨μ νΈμΆ
// μΈμ 1κ³Ό 2κ° λ§€κ°λ³μ xμ yμ μμλλ‘ ν λΉλκ³ ν¨μ λͺΈμ²΄μ λ¬Έλ€μ΄ μ€νλλ€.
var result = add(1, 2);
λ§€κ°λ³μ
- ν¨μλ₯Ό μ μν λ μ μΈ
- ν¨μ λͺΈμ²΄ λ΄λΆμμ λ³μμ λμΌνκ² μ·¨κΈ
- ν¨μκ° νΈμΆλλ©΄ ν¨μ λͺΈμ²΄ λ΄μμ μ묡μ μΌλ‘ λ§€κ°λ³μ μμ±
- μΌλ° λ³μμ λ§μ°¬κ°μ§λ‘ undefinedλ‘ μ΄κΈ°νλ μ΄ν μΈμκ° μμλλ‘ ν λΉ
- β οΈ ν¨μ λͺΈμ²΄ λ΄λΆμμλ§ μ°Έμ‘° κ°λ₯(ν¨μ λͺΈμ²΄ μΈλΆμμλ μ°Έμ‘° X)
μΈμ
- β οΈ λ§€κ°λ³μ > μΈμ; ν λΉλμ§ μμ λ§€κ°λ³μμ κ°: undefined; NaN λ°ν
- β οΈ λ§€κ°λ³μ < μΈμ; μ΄κ³Όλ μΈμ 무μ
2) μΈμ νμΈ
μλ°μ€ν¬λ¦½νΈμ κ²½μ° ν¨μλ₯Ό μ μν λ μ μ ν μΈμκ° μ λ¬λμλμ§ νμΈν νμκ° μλ€.
κ·Έ μ΄μ λ λ€μκ³Ό κ°λ€.
- μλ°μ€ν¬λ¦½νΈ ν¨μλ λ§€κ°λ³μμ μΈμμ κ°μκ° μΌμΉνλμ§ νμΈ X
- μλ°μ€ν¬λ¦½νΈλ λμ νμ μΈμ΄ -> μλ°μ€ν¬λ¦½νΈ ν¨μλ λ§€κ°λ³μμ νμ μ μ¬μ μ μ μ₯ν μ X
3) λ§€κ°λ³μμ μ΅λ κ°μ
- λ§€κ°λ³μλ μμμ μλ―Έκ° μλ€. λ°λΌμ λ§€κ°λ³μκ° λ§μμ§λ©΄ ν¨μλ₯Ό νΈμΆν λ μ λ¬ν΄μΌ ν μΈμμ μμλ₯Ό κ³ λ €ν΄μΌ νλ€.
- ν¨μμ λ§€κ°λ³μλ μ½λλ₯Ό μ΄ν΄νλ λ° λ°©ν΄λλ μμμ΄λ―λ‘, μ΄μμ μΈ λ§€κ°λ³μμ κ°μλ 0κ°μ΄λ©°, μ μμλ‘ μ’λ€.
- μ΄μμ μΈ ν¨μλ ν κ°μ§ μΌλ§ ν΄μΌ νλ©° κ°κΈμ μκ² λ§λ€μ΄μΌ νλ€.
- β‘οΈ λ§€κ°λ³μλ μ΅λ 3κ° μ΄μμ λμ§ μλ κ²μ κΆμ₯νλ€.
4) λ°νλ¬Έ
ν¨μλ return ν€μλμ ννμ(λ°νκ°)μΌλ‘ μ΄λ£¨μ΄μ§ λ°νλ¬Έμ μ¬μ©ν΄ μ€ν κ²°κ³Όλ₯Ό ν¨μ μΈλΆλ‘ λ°ν(return)ν μ
μλ€.
π₯οΈ μμ μ½λ
function multiply(x, y) {
return x * y; // λ°νλ¬Έ
}
// ν¨μ νΈμΆμ λ°νκ°μΌλ‘ νκ°λλ€.
var result = multiply(3, 5);
console.log(result); // 15
ν¨μ νΈμΆμ ννμμ΄λ€.
π‘ λ°νλ¬Έ
- λ°νλ¬Έμ ν¨μμ μ€νμ μ€λ¨νκ³ ν¨μ λͺΈμ²΄λ₯Ό λΉ μ Έλκ°λ€.
- λ°λΌμ λ°νλ¬Έ μ΄νμ λ€λ₯Έ λ¬Έμ΄ μ‘΄μ¬ -> κ·Έ λ¬Έμ μ€νλμ§ μκ³ λ¬΄μ
- λ°νλ¬Έμ return ν€μλ λ€μ μ€λ ννμμ νκ°ν΄ λ°ννλ€.
- return ν€μλ λ€μ λ°νκ°μΌλ‘ μ¬μ©ν ννμμ λͺ μμ μΌλ‘ μ§μ X -> undefined λ°ν
- λ°νλ¬Έ μλ΅ κ°λ₯
- ν¨μ λͺΈμ²΄μ λ§μ§λ§ λ¬ΈκΉμ§ μ€ν -> μ묡μ μΌλ‘ undefined λ°ν
- λ°νλ¬Έμ ν¨μ λͺΈμ²΄ λ΄λΆμμλ§ μ¬μ© κ°λ₯
06. μ°Έμ‘°μ μν μ λ¬κ³Ό μΈλΆ μνμ λ³κ²½
λ§€κ°λ³μλ ν¨μ λͺΈμ²΄ λ΄λΆμμ λ³μμ λμΌνκ² μ·¨κΈλλ―λ‘, λ§€κ°λ³μ λν νμ μ λ°λΌ κ°μ μν μ λ¬(κ°μ μν νΈμΆ), μ°Έμ‘°μ μν μ λ¬(μ°Έμ‘°μ μν νΈμΆ) λ°©μμ κ·Έλλ‘ λ°λ₯Έλ€.
07. λ€μν ν¨μμ νν
1) μ¦μ μ€ν ν¨μ
ν¨μ μ μμ λμμ μ¦μ νΈμΆλλ ν¨μ
π₯οΈ μμ μ½λ
// μ΅λͺ
μ¦μ μ€ν ν¨μ
(function () {
var a = 3;
var b = 5;
return a * b;
}());
β‘οΈ μ¦μ μ€ν ν¨μλ ν¨μ μ΄λ¦μ΄ μλ μ΅λͺ ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μ΄λ€.
β‘οΈ μ¦μ μ€ν ν¨μλ λ°λμ κ·Έλ£Ή μ°μ°μ ( ... )λ‘ κ°μΈμΌ νλ€.
β οΈ κΈ°λͺ μ¦μ μ€ν ν¨μλ μ¬μ©ν μλ μμ§λ§ -> ν¨μ μ΄λ¦μ ν¨μ λͺΈμ²΄μμλ§ μ°Έμ‘°ν μ μλ μλ³μμ΄λ―λ‘, λ€μ νΈμΆ X
2) μ¬κ· ν¨μ
ν¨μκ° μκΈ° μμ μ νΈμΆνλ κ²μ μ¬κ· νΈμΆμ΄λΌκ³ νλ©°, μ¬κ· νΈμΆμ μννλ ν¨μλ₯Ό μ¬κ· ν¨μλΌκ³ νλ€.
π₯οΈ μμ μ½λ
// λ°λ³΅λ¬Έμ ν΅ν΄ ꡬν
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);
β οΈ μ¬κ· ν¨μ λ΄μλ μ¬κ· νΈμΆμ λ©μΆ μ μλ νμΆ μ‘°κ±΄μ λ°λμ λ§λ€μ΄μΌ νλ€.
β‘οΈ νμΆ μ‘°κ±΄μ΄ μμΌλ©΄ ν¨μκ° λ¬΄ν νΈμΆλμ΄ μ€ν μ€λ²νλ‘(stack overflow) μλ¬κ° λ°μνλ€.
π‘ λλΆλΆμ μ¬κ· ν¨μλ for λ¬Έμ΄λ while λ¬ΈμΌλ‘ ꡬν κ°λ₯νλ€.
π‘ μ¬κ· ν¨μλ λ°λ³΅λλ μ²λ¦¬λ₯Ό λ°λ³΅λ¬Έ μμ΄ κ΅¬νν μ μλ€λ μ₯μ μ΄ μλ€.
β οΈ λ¬΄ν λ°λ³΅μ λΉ μ§ μν -> μ€ν μ€λ²νλ‘ μλ¬ λ°μμν¬ μ μμ
β‘οΈ λ°λ³΅λ¬Έμ μ¬μ©νλ κ²λ³΄λ€ μ¬κ· ν¨μλ₯Ό μ¬μ©νλ νΈμ΄ λ μ§κ΄μ μΌλ‘ μ΄ν΄νκΈ° μ¬μΈ λλ§ νμ μ μΌλ‘ μ¬μ©νμ!
3) μ€μ²© ν¨μ
ν¨μ λ΄λΆμ μ μλ ν¨μλ₯Ό μ€μ²© ν¨μ(nested function) λλ λ΄λΆ ν¨μ(inner function)λΌκ³ νλ€.
μ€μ²© ν¨μλ₯Ό ν¬ν¨νλ ν¨μλ₯Ό μΈλΆ ν¨μ(outer function)λΌ λΆλ₯Έλ€.
π₯οΈ μμ μ½λ
function outer() {
var x = 1;
// μ€μ²© ν¨μ
function inner() {
var y = 2;
// μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°ν μ μλ€.
console.log(x + y); // 3
}
inner();
}
outer();
4) μ½λ°± ν¨μ
ν¨μμ λ§€κ°λ³μλ₯Ό ν΅ν΄ λ€λ₯Έ ν¨μμ λ΄λΆλ‘ μ λ¬λλ ν¨μλ₯Ό μ½λ°± ν¨μ(callback function)λΌκ³ νλ€.
λ§€κ°λ³μλ₯Ό ν΅ν΄ ν¨μμ μΈλΆμμ μ½λ°± ν¨μλ₯Ό μ λ¬λ°μ ν¨μλ₯Ό κ³ μ°¨ ν¨μ(High-Order Function, HOF)λΌκ³ νλ€.
π₯οΈ μμ μ½λ <μ΄λ€ μΌμ λ°λ³΅ μννλ repeat ν¨μλ₯Ό μ μ>
// nλ§νΌ μ΄λ€ μΌμ λ°λ³΅νλ€.
function repeat(n) {
// iλ₯Ό μΆλ ₯νλ€.
for (var i = 0; i < n; i++) console.log(i);
}
repeat(5); // 0 1 2 3 4
β‘οΈ repeat ν¨μλ console.log(i)μ κ°νκ² μμ‘΄νκ³ μμ΄ λ€λ₯Έ μΌμ ν μ μλ€.
β‘οΈ λ§μ½ repeat ν¨μμ λ°λ³΅λ¬Έ λ΄λΆμμ λ€λ₯Έ μΌμ νκ³ μΆλ€λ©΄ ν¨μλ₯Ό μλ‘κ² μ μν΄μΌ νλ€.
π₯οΈ μμ μ½λ
// nλ§νΌ μ΄λ€ μΌμ λ°λ³΅νλ€.
function repeat1(n) {
// iλ₯Ό μΆλ ₯νλ€.
for (var i = 0; i < n; i++) console.log(i);
}
repeat1(5); // 0 1 2 3 4
// nλ§νΌ μ΄λ€ μΌμ λ°λ³΅νλ€.
function repeat2(n) {
for (var i = 0; i < n; i++) {
// iκ° νμμΌ λλ§ μΆλ ₯νλ€.
if (i % 2) console.log(i);
}
}
repeat2(5); // 1 3
β‘οΈ μ μμ μ ν¨μλ€μ ν¨μμ μΌλΆλΆλ§ λ€λ₯΄κΈ° λλ¬Έμ λ§€λ² ν¨μλ₯Ό μλ‘κ² μ μν΄μΌ νλ€.
π‘ ν¨μμ λ³νμ§ μλ κ³΅ν΅ λ‘μ§μ 미리 μ μν΄λκ³ , κ²½μ°μ λ°λΌ λ³κ²½λλ λ‘μ§μ μΆμννμ¬ ν¨μ μΈλΆμμ ν¨μ λ΄λΆλ‘ μ λ¬νμ¬ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
π₯οΈ μμ μ½λ
// μΈλΆμμ μ λ¬λ°μ 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
5) μμ ν¨μμ λΉμμ ν¨μ
μ΄λ€ μΈλΆ μνμ μμ‘΄νμ§λ μκ³ λ³κ²½νμ§λ μλ, μ¦ λΆμ ν¨κ³Όκ° μλ ν¨μλ₯Ό μμ ν¨μ(pure function)λΌκ³ νλ€. -> μ€μ§ λ§€κ°λ³μλ₯Ό ν΅ν΄ ν¨μ λ΄λΆλ‘ μ λ¬λ μΈμμκ²λ§ μμ‘΄ν΄ κ°μ μμ±ν΄ λ°ννλ€.
μΈλΆ μνμ μμ‘΄νκ±°λ μΈλΆ μνλ₯Ό λ³κ²½νλ, μ¦ λΆμ ν¨κ³Όκ° μλ ν¨μλ₯Ό λΉμμ ν¨μ(impure function)λΌκ³ νλ€.
μμ λ₯Ό ν΅ν΄ μμ ν¨μμ λΉμμ ν¨μλ₯Ό λΉκ΅ν΄λ³΄μ.
π₯οΈ μμ μ½λ <μμ ν¨μ>
var count = 0; // νμ¬ μΉ΄μ΄νΈλ₯Ό λνλ΄λ μν
// μμ ν¨μ increaseλ λμΌν μΈμκ° μ λ¬λλ©΄ μΈμ λ λμΌν κ°μ λ°ννλ€.
function increase(n) {
return ++n;
}
// μμ ν¨μκ° λ°νν κ²°κ³Όκ°μ λ³μμ μ¬ν λΉν΄μ μνλ₯Ό λ³κ²½
count = increase(count);
console.log(count); // 1
count = increase(count);
console.log(count); // 2
π₯οΈ μμ μ½λ <λΉμμ ν¨μ>
var count = 0; // νμ¬ μΉ΄μ΄νΈλ₯Ό λνλ΄λ μν: increase ν¨μμ μν΄ λ³ν
// λΉμμ ν¨μ
function increase() {
return ++count; // μΈλΆ μνμ μμ‘΄νλ©° μΈλΆ μνλ₯Ό λ³κ²½
}
// λΉμμ ν¨μλ μΈλΆ μν(count)λ₯Ό λ³κ²½ -> μν λ³ν μΆμ νκΈ° μ΄λ €μ
increase();
console.log(count); // 1
increase();
console.log(count); // 2
π μ°Έκ³ μλ£