12_ν¨μ
12.1 ν¨μλ?
νλ‘κ·Έλλ° μΈμ΄μ ν¨μλ
- μΌλ ¨μ κ³Όμ μ λ¬Έ(statement)μΌλ‘ ꡬννκ³
- μ½λ λΈλ‘μΌλ‘ κ°μΈμ νλμ μ€ν λ¨μλ‘ μ μν κ² μ΄λ€.
κ° μ©μ΄μ λν κ°λ¨ν μ€λͺ μ,
- ν¨μ λ΄λΆλ‘ μ λ ₯μ μ λ¬λ°λ λ³μλ₯Ό 맀κ°λ³μ(parameter)
- μ λ ₯μ μΈμ(argument)
- μΆλ ₯μ λ°νκ°(return value)
ν¨μλ μ μλ§μΌλ‘ μ€νλλ κ²μ μλλ―λ‘, μ€νμ λͺ
μμ μΌλ‘ μ§μν΄μΌ νλ€.
-> μ΄λ₯Ό ν¨μ νΈμΆ μ΄λΌ νλ€.
12.2 ν¨μλ₯Ό μ¬μ©νλ μ΄μ
- ν¨μλ λͺ λ²μ΄λ νΈμΆν μ μμΌλ―λ‘ μ½λμ μ¬μ¬μ© μ΄λΌλ μΈ‘λ©΄μμ λ§€μ° μ μ©νλ€.
- μ½λμ μ€λ³΅μ μ΅μ νκ³ μ¬μ¬μ©μ±μ λμ΄λ ν¨μλ μ μ§λ³΄μμ νΈμμ± μ λμ΄κ³ μ½λμ μ λ’°μ± μ λμΈλ€.
12.3 ν¨μ 리ν°λ΄
ν¨μ 리ν°λ΄μ,
- function ν€μλ
- ν¨μ μ΄λ¦
- λ§€κ° λ³μ λͺ©λ‘
- ν¨μ λͺΈμ²΄
μμ κ°μ΄ ꡬμ±λλ€.
ν¨μ 리ν°λ΄μ νκ°λλ κ°μ μμ± νλ©° ν¨μλ κ°μ²΄ μ΄λ€.
// λ³μμ ν¨μ 리ν°λ΄μ ν λΉ
const funcAdd = function add(x, y) {
return x + y;
}
12.4 ν¨μ μ μ
ν¨μλ₯Ό νΈμΆνκΈ° μ΄μ μ μΈμλ₯Ό μ λ¬λ°μ 맀κ°λ³μ μ μ€νν λ¬Έλ€, κ·Έλ¦¬κ³ λ°νν κ°μ μ§μ νλ κ²μ λ§νλ€.
ν¨μλ₯Ό μ μνλ λ°©λ²μ,
- ν¨μ μ μΈλ¬Έ
- ν¨μ ννμ
- function μμ±μ ν¨μ
- νμ΄ν ν¨μ(ES6)
12.4.1 ν¨μ μ μΈλ¬Έ
ν¨μ μ μΈλ¬Έμ ν¨μ 리ν°λ΄κ³Ό ννκ° λμΌνλ€,
λ¨, ν¨μ 리ν°λ΄μ ν¨μ μ΄λ¦μ μλ΅ ν μ μμΌλ, ν¨μ μ μΈλ¬Έμ ν¨μ μ΄λ¦μ μλ΅ ν μ μλ€.
function add(x, y) {
return x+y;
}
12.4.2 ν¨μ ννμ
ν¨μλ μΌκΈ κ°μ²΄ μ΄λ―λ‘ ν¨μ 리ν°λ΄λ‘ μμ±ν ν¨μ κ°μ²΄λ₯Ό λ³μμ ν λΉ ν μ μλλ°,
μ΄λ¬ν ν¨μ μ μ λ°©μμ ν¨μ ννμ μ΄λΌ νλ€.
μΌκΈ κ°μ²΄λ?
μλ°μ€ν¬λ¦½νΈμ ν¨μλ κ°μ²λΌ λ³μμ ν λΉν μλ μκ³ , νλ‘νΌν° κ°μ΄ λ μλ μμΌλ©° λ°°μ΄μ μμκ° λ μλ μλ€. μ΄μ²λΌ κ°μ μ±μ§μ κ°λ κ°μ²΄λ₯Ό μΌκΈ κ°μ²΄λΌ νλ€. μλ°μ€ν¬λ¦½νΈμ ν¨μλ μΌκΈ κ°μ²΄λ€.
12.4.3 ν¨μ μμ± μμ κ³Ό νΈμ΄μ€ν
ν¨μ ννμμΌλ‘ μ μν ν¨μ μ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μ μ μμ± μμ μ΄ λ€λ₯΄λ€.
- ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μλ ν¨μ μ μΈλ¬Έ μ΄μ μ νΈμΆν μ μλ€.
- ν¨μ μ μΈλ¬ΈμΌλ‘ μ μνλ©΄ λ°νμ μ΄μ μ ν¨μ κ°μ²΄κ° λ¨Όμ μμ±λκ³
- μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μ μ΄λ¦κ³Ό λμΌν μ΄λ¦μ μλ³μλ₯Ό μ묡μ μΌλ‘ μμ±νκ³ , μμ±λ ν¨μ κ°μ²΄λ₯Ό ν λΉνλ€.
β μ¦, λ°νμ μμ μλ μ΄λ―Έ ν¨μ κ°μ²΄κ° μμ±λμ΄ μκ³ , ν¨μ μ΄λ¦κ³Ό λμΌν μλ³μμ ν λΉκΉμ§ μλ£λ μνμ΄λ€. (= νΈμ΄μ€ν )
- ν¨μ ννμμΌλ‘ μ μν ν¨μλ ν¨μ ννμ μ΄μ μ νΈμΆν μ μλ€.
- ν¨μ ννμμ λ³μμ ν λΉλλ κ°μ΄ ν¨μ 리ν°λ΄μΈ λ¬Έμ΄λ€.
- λ°λΌμ ν¨μ ννμμ λ³μ μ μΈλ¬Έκ³Ό λ³μ ν λΉλ¬Έμ ν λ²μ κΈ°μ ν μΆμ½ ννκ³Ό λμΌνκ² λμνλ€.
- λ³μ μ μΈμ λ°νμ μ΄μ μ μ€νλμ΄ undefinedλ‘ μ΄κΈ°νλλ€.
- ν¨μ ννμ μ΄μ μ ν¨μλ₯Ό μ°Έμ‘°νλ©΄ undefinedλ‘ νκ°λλλ°, μ΄λ ν¨μλ₯Ό νΈμΆνλ©΄ undefinedλ₯Ό νΈμΆνλ κ²κ³Ό λ§μ°¬κ°μ§μ΄λ―λ‘ νμ
μλ¬κ° λ°μνλ μ£Όμ!!
β ν¨μ ννμμΌλ‘ μ μν ν¨μλ λ°λμ ν¨μ ννμ μ΄νμ μ°Έμ‘° λλ νΈμΆν΄μΌ νμ μλ¬κ° λ°μνμ§ μλλ€.
12.4.4 Function μμ±μ ν¨μ
μλ°μ€ν¬λ¦½νΈκ° κΈ°λ³Έ μ 곡νλ λΉνΈμΈ ν¨μμΈ Function
μμ±μ ν¨μμ 맀κ°λ³μ λͺ©λ‘ κ³Ό ν¨μ λͺΈμ²΄ λ₯Ό λ¬Έμμ΄λ‘ μ λ¬νλ©΄μ new
μ°μ°μμ ν¨κ» νΈμΆνλ©΄ ν¨μ κ°μ²΄λ₯Ό μμ±ν΄μ λ°ννλ€.
μμ±μ ν¨μλ κ°μ²΄λ₯Ό μμ±νλ ν¨μ
var add = new Function('x', 'y', 'return x + y');
μ£Όμ !!
Function μμ±μ ν¨μλ‘ ν¨μλ₯Ό μμ±νλ λ°©μμ μΌλ°μ μ΄μ§ μμΌλ©° λ°λμ§νμ§λ μλ€.
ν΄λ‘μ λ₯Ό μμ±νμ§ μλ λ±, ν¨μ μ μΈλ¬Έμ΄λ ν¨μ ννμμΌλ‘ μμ±ν ν¨μμ λ€λ₯΄κ² λμνλ€
12.4.5 νμ΄ν ν¨μ
ES6μμ λμ λ νμ΄ν ν¨μ(arrow function) μ function ν€μλ λμ μ νμ΄ν( => ) λ₯Ό μ¬μ©ν΄μ μ’ λ κ°λ΅ν λ°©λ²μΌλ‘ ν¨μλ₯Ό μ μΈ ν μ μλ€.
- νμ΄ν ν¨μλ μμ±μ ν¨μλ‘ μ¬μ©ν μ μμΌλ©°
- κΈ°μ‘΄ ν¨μμ this λ°μΈλ© λ°©μμ΄ λ€λ₯΄κ³ ,
- prototype νλ‘νΌν°κ° μμΌλ©°
- arguments κ°μ²΄λ₯Ό μμ±νμ§ μλλ€.
var add = (x, y) => x + y;
console.log(add(2, 5)); // 7
12.5 ν¨μ νΈμΆ
ν¨μλ ν¨μλ₯Ό κ°λ¦¬ν€λ μλ³μμ ν μμ μκ΄ν() μΈ ν¨μ νΈμΆ μ°μ°μλ‘ νΈμΆλλ€.
12.5.1 맀κ°λ³μμ μΈμ
ν¨μλ₯Ό μ€ννκΈ° μν΄ νμν κ°μ ν¨μ μΈλΆμμ λ΄λΆλ‘ μ λ¬ν νμκ° μλ κ²½μ°, 맀κ°λ³μλ₯Ό ν΅ν΄ μΈμλ₯Ό μ λ¬νλ€.
- μΈμ : ν¨μλ₯Ό νΈμΆν λ μ§μ νλ©°, κ°μμ νμ μ μ νμ΄ μλ€.
- 맀κ°λ³μ : ν¨μλ₯Ό μ μν λ μ μΈνλ©°, μ€μ½ν(μ ν¨λ²μ)λ ν¨μ λ΄λΆμ΄λ€.
// ν¨μ μ μΈλ¬Έ
function add(x, y) {
return x + y;
}
// ν¨μ νΈμΆ
// μΈμ 1κ³Ό 2λ 맀κ°λ³μ xμ yμ μμλλ‘ ν λΉλκ³ ν¨μ λͺΈμ²΄μ λ¬Έλ€μ΄ μ€νλλ€.
var result = add(1, 2);
12.5.2 μΈμ νμΈ
function add(x, y) {
return x + y;
}
console.log(add(2)); // NaN
console.log(add('a', 'b')); // 'ab'
μ μ½λλ μλ°μ€ν¬λ¦½νΈ λ¬Έλ²μ μ΄λ ν λ¬Έμ λ μμΌλ―λ‘ μλ°μ€ν¬λ¦½νΈ μμ§μ μλ¬΄λ° μ΄μ μ κΈ°μμ΄ μ€νν κ²μ΄λ€. μ΄λ¬ν μν©μ΄ κ°λ₯ν μ΄μ λ,
- μλ°μ€ν¬λ¦½νΈ ν¨μλ 맀κ°λ³μμ μΈμμ κ°μκ° μΌμΉνλμ§ νμΈνμ§ μλλ€.
- μλ°μ€ν¬λ¦½νΈλ λμ νμ μΈμ΄λ€. λ°λΌμ μλ°μ€ν¬λ¦½νΈ ν¨μλ 맀κ°λ³μμ νμ μ μ¬μ μ μ§μ ν μ μλ€.
κ·Έλμ μλ°μ€ν¬λ¦½νΈλ ν¨μλ₯Ό μ μν λ μ μ ν μΈμκ° μ λ¬λμλμ§ νμΈν νμκ° μλ€.
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: μΈμλ λͺ¨λ μ«μ κ°μ΄μ΄μΌ ν©λλ€.
12.5.3 맀κ°λ³μμ μ΅λ κ°μ
ECMAScirpt μ¬μμμλ 맀κ°λ³μμ μ΅λ κ°μμ λν΄ λͺ μμ μΌλ‘ μ ννκ³ μμ§λ μμ§λ§, 물리μ νκ³λ μμΌλ―λ‘ μλ°μ€ν¬λ¦½νΈ μμ§λ§λ€ 맀κ°λ³μμ μ΅λ κ°μμ λν μ νμ μλ€.
- 맀κ°λ³μλ μμμ μλ―Έκ° μλ€.
- λ°λΌμ 맀κ°λ³μκ° λ§μμ§λ©΄ ν¨μλ₯Ό νΈμΆν λ μ λ¬ν΄μΌ ν μΈμμ μμλ₯Ό κ³ λ €ν΄μΌ νλ€.
- ν¨μμ 맀κ°λ³μλ μ½λλ₯Ό μ΄ν΄νλ λ° λ°©ν΄λλ μμμ΄λ―λ‘, μ΄μμ μΈ λ§€κ°λ³μμ κ°μλ 0κ°μ΄λ©°
- μ΅λ 3κ° μ΄μμ λμ§ μλ κ²μ κΆμ₯
- 맀κ°λ³μμ κ°μκ° λ§λ€λ κ²μ ν¨μκ° μ¬λ¬κ°μ§ μΌμ νλ€λ μ¦κ±°μ΄λ―λ‘ λ°λμ§νμ§ μλ€.
μ΄μμ μΈ ν¨μλ ν κ°μ§ μΌλ§ ν΄μΌ νλ©° κ°κΈμ μκ² λ§λ€μ΄μΌ νλ€.
12.5.4 λ°νλ¬Έ
ν¨μλ return
ν€μλμ λ°ν κ°μΌλ‘ μ΄λ€μ§ λ°νλ¬Έμ μ¬μ©ν΄ μ€ν κ²°κ³Όλ₯Ό ν¨μ μΈλΆλ‘ λ°ν ν μ μλ€.
λ°νλ¬Έμ λ κ°μ§ μν μ νλλ°,
- 첫째, λ°νλ¬Έμ ν¨μμ μ€νμ μ€λ¨νκ³ ν¨μ λͺΈμ²΄λ₯Ό λΉ μ Έλκ°λ€.
- λ°νλ¬Έ μ΄νμ λ€λ₯Έ λ¬Έμ΄ μ‘΄μ¬νλ©΄ κ·Έ λ¬Έμ μ€νλμ§ μκ³ λ¬΄μλλ€.
- λμ§Έ, λ°νλ¬Έμ return ν€μλ λ€μ μ€λ ννμμ νκ°μ λ°ννλ€.
- return ν€μλ λ€μ λ°νκ°μΌλ‘ μ¬μ©ν ννμμ λͺ μμ μΌλ‘ μ§μ νμ§ μμΌλ©΄ undefinedκ° λ°νλλ€.
12.6 λ€μν ν¨μμ νν
12.6.1 μ¦μ μ€ν ν¨μ
ν¨μ μ μμ λμμ μ¦μ νΈμΆλλ ν¨μ
- λ¨ ν λ²λ§ νΈμΆλλ©° λ€μ νΈμΆ ν μ μλ€.
// μ¦μ μ€ν ν¨μλ μ΅λͺ
ν¨μλ‘ μ¬μ©νλ κ²μ΄ μΌλ°μ μ΄λ€.
(function () {
var a = 3;
var b = 5;
return a*b;
} ());
12.6.2 μ¬κ· ν¨μ
ν¨μκ° μκΈ° μμ μ νΈμΆνλ κ²
- μ¬κ· ν¨μλ μκΈ° μμ μ νΈμΆνλ νμ
- μ¬κ· ν¨μλ μμ μ 무ν μ¬κ· νΈμΆ νλ―λ‘ νμΆ μ‘°κ±΄μ λ§λ€μ΄μΌ μ€ν μ€λ² νλ‘ μλ¬κ° λ°μνμ§ μλλ€.
// ν¨μ ννμ
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
12.6.3 μ€μ²© ν¨μ
μ€μ²© ν¨μ ( = λ΄λΆ ν¨μ )
- ν¨μ λ΄λΆμ μ μλ ν¨μ
- μ€μ²© ν¨μλ μΈλΆ ν¨μ λ΄μμλ§ νΈμΆ ν μ μλ€.
- μΌλ°μ μΌλ‘ μ€μ²© ν¨μλ μμ μ ν¬ν¨νλ μΈλΆ ν¨μλ₯Ό λλ ν¬νΌ ν¨μ μ μν μ νλ€.
function outer() {
var x = 1;
// μ€μ²© ν¨μ
function inner() {
var y = 2;
// μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘°ν μ μλ€.
console.log(x + y); // 3
}
inner();
}
outer();
12.6.4 μ½λ°± ν¨μ
ν¨μμ 맀κ°λ³μλ₯Ό ν΅ν΄ λ€λ₯Έ ν¨μμ λ΄λΆλ‘ μ λ¬λλ ν¨μ
- 맀κ°λ³μλ₯Ό ν΅ν΄ ν¨μμ μΈλΆμμ μ½λ°± ν¨μλ₯Ό μ λ¬λ°μ ν¨μλ₯Ό κ³ μ°¨ ν¨μ λΌκ³ νλ€.
- κ³ μ°¨ ν¨μλ μ½λ°± ν¨μλ₯Ό μμ μ μΌλΆλΆμΌλ‘ ν©μ±νλ©°
- 맀κ°λ³μλ₯Ό ν΅ν΄ μ λ¬λ°μ μ½λ°± ν¨μμ νΈμΆ μμ μ κ²°μ ν΄μ νΈμΆνλ€.
// μΈλΆμμ μ λ¬λ°μ 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
'π Book-Talk > λͺ¨λ JS Deep Dive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive_μ μ λ³μμ λ¬Έμ μ (0) | 2022.11.15 |
---|---|
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive_μ€μ½ν (0) | 2022.11.11 |
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive_μμ κ°κ³Ό κ°μ²΄μ λΉκ΅ (0) | 2022.11.11 |
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive_κ°μ²΄ 리ν°λ΄ (0) | 2022.11.11 |
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive_νμ λ³ν (0) | 2022.11.11 |