π€ Chapter 4: ν¨μμ λ©μλ
π¦ ν¨μ μ μΈλ¬Έβ
- μλ°μ€ν¬λ¦½νΈμμ ν¨μλ
function
ν€μλλ‘ λ§λλ ν¨μμ=>
κΈ°νΈλ‘ λ§λλ νμ΄ν ν¨μ λ κ°μ§ μλ€. - νμ μ€ν¬λ¦½νΈ ν¨μ μ μΈλ¬Έμ μλ°μ€ν¬λ¦½νΈ ν¨μ μ μΈλ¬Έμμ 맀κ°λ³μμ ν¨μ λ°νκ°μ νμ μ£Όμμ λΆμ΄λ λ€μ ννλ‘ κ΅¬μ±λλ€.
function add(a: number, b: number): number {
return a + b;
}
let result = add(1, 2);
π 맀κ°λ³μμ λ°νκ°μ νμ μ£Όμ μλ΅β
- ν¨μ μ μΈλ¬Έμμλ 맀κ°λ³μμ λ°νκ°μ λν νμ μ£Όμμ μλ΅ν μ μλ€.
- λ€λ§, λ³μ λμλ λ¬λ¦¬ ν¨μμ 맀κ°λ³μ νμ κ³Ό λ°ν νμ μ μλ΅νλ κ²μ λ°λμ§νμ§ μλ€. μλνλ©΄, νμ μ΄ μλ΅λμ΄ μμΌλ©΄ ν¨μμ ꡬν μλλ₯Ό μκΈ° μ΄λ ΅κ³ μλͺ» μ¬μ©νκΈ° μ½κΈ° λλ¬Έμ΄λ€.
π void νμ β
- κ°μ λ°ννμ§ μλ ν¨μλ λ°ν νμ
μ΄
void
μ΄λ€. void
νμ μ ν¨μ λ°ν νμ μΌλ‘λ§ μ¬μ©ν μ μλ€.
function printMe(name: string, age: number): void {
console.log(`name: ${name}, age: ${age}`);
}
π ν¨μ μκ·Έλμ²β
- λ³μμ νμ μ΄ μλ―μ΄ ν¨μ λν νμ μ΄ μλλ°, ν¨μμ νμ μ ν¨μ μκ·Έλμ²λΌκ³ νλ€.
(맀κ°λ³μ1νμ
, 맀κ°λ³μ2νμ
[, ...]) => λ°νκ° νμ
- λ€μ
printMe
ν¨μλstring
κ³Όnumber
νμ μ 맀κ°λ³μκ° λ κ° μκ³ λ°ν νμ μ΄void
μ΄λ€. - λ°λΌμ ν¨μ μκ·Έλμ²λ
(string, number) => void
μ΄λ€.
let printMe: (string, number) => void = function (name: string, age: number): void {}
- λ§μ½ 맀κ°λ³μκ° μμΌλ©΄ λ¨μν
()
λ‘ νννλ€.() => void
λ 맀κ°λ³μλ μκ³ λ°νκ°λ μλ ν¨μ μκ·Έλμ²μ΄λ€.
π type ν€μλλ‘ νμ λ³μΉ λ§λ€κΈ°β
- νμ
μ€ν¬λ¦½νΈλ
type
μ΄λΌλ ν€μλλ₯Ό μ 곡νλ€. type
ν€μλλ κΈ°μ‘΄μ μ‘΄μ¬νλ νμ μ λ¨μν μ΄λ¦λ§ λ°κΏμ μ¬μ©ν μ μκ² ν΄μ€λ€.- μ΄λ¬ν κΈ°λ₯μ νμ λ³μΉ(type alias)μ΄λΌκ³ νλ€.
type μλ‘μ΄νμ
= κΈ°μ‘΄νμ
(string, number) => void
ν¨μ μκ·Έλμ²λ₯ΌstringNumberFunc
μ΄λΌλ μ΄λ¦μΌλ‘ νμ λ³μΉμ λ§λ λ€.- μ΄ λ³μΉ λλΆμ λ³μ
f
μg
μ νμ μ£Όμμ λ μμνκ² λΆμΌ μ μλ€.
type stringNumberFunc = (string, number) => void;
let f: stringNumberFunc = function(a: string, b: number): void {}
let g: stringNumberFunc = function(c: string, d: number): void {}
- ν¨μμ νμ , μ¦ ν¨μ μκ·Έλμ²λ₯Ό λͺ μνλ©΄ 맀κ°λ³μμ κ°μλ νμ , λ°ν νμ μ΄ λ€λ₯Έ ν¨μλ₯Ό μ μΈνλ μλͺ»μ λ―Έμ°μ λ°©μ§ν μ μλ€.
// μλ΅...
let h: stringNumberFunc = function () {}
h(); // 2κ°μ μΈμκ° νμνλ° 0κ°λ₯Ό κ°μ Έμμ΅λλ€.
π undefined κ΄λ ¨ μ£Όμ μ¬νβ
undefined
νμ μ νμ μ€ν¬λ¦½νΈμ νμ κ³μΈ΅λμμ λͺ¨λ νμ μ€ μ΅νμ νμ μ΄λ€.- λ€μμ
undefined
λ₯Ό κ³ λ €νμ§ μμ μμ΄λ€.
interface INameable {
name: string;
}
function getName(o: INameable) { return o.name; }
let n = getName(undefined); // μ€λ₯ λ°μ
console.log(n);
getName
μINameable
νμ μ 맀κ°λ³μλ₯Ό μꡬνμ§λ§,undefined
νΈμΆν΄λ ꡬ문 μ€λ₯κ° λ°μνμ§ μλλ€.- μ¦,
undefined
λ μ΅νμ νμ μ΄λ―λ‘INameable
μ μμνλ μμ νμ μΌλ‘ κ°μ£Όνλ€. - νμ§λ§, μ½λλ₯Ό μ€ννλ©΄ μ€λ₯κ° λ°μνλ€.
- λ€μμ
undefined
λ₯Ό κ³ λ €ν μμ΄λ€.
interface INameable {
name: string;
}
function getName(o: INameable) {
return o != undefined ? o.name : 'unknown name';
}
let n = getName(undefined);
console.log(n); // unknown name
console.log(getName({ name: 'Jack' })); // Jack
- λ§μ½ μΈν°νμ΄μ€μ μ ν μμ±μ΄ μλ€λ©΄ λ€μκ³Ό κ°μ΄ ꡬνν΄μΌ νλ€.
interface IAgeable {
age?: number;
}
function getAge(o: IAgeable) {
return o != undefined && o.age ? o.age : 0;
}
console.log(getAge(undefined)); // 0
console.log(getAge(null)); // 0
console.log(getAge({ age: 32 })); // 32
π μ νμ 맀κ°λ³μβ
- ν¨μμ 맀κ°λ³μμλ λ€μμ²λΌ μ΄λ¦ λ€μ λ¬Όμνλ₯Ό λΆμΌ μ μμΌλ©°, μ΄λ₯Ό μ νμ 맀κ°λ³μλΌκ³ νλ€.
function fn(arg1: string, arg?: number): void {}
- μ νμ 맀κ°λ³μλ λ€μ μ½λμμ ν¨μ νΈμΆμ λͺ¨λ κ°λ₯νκ² νκ³ μΆμ λ μ¬μ©νλ€.
function fn(arg1: string, arg?: number) { console.log(`arg: ${arg}`); }
fn('hello', 1); // arg: 1
fn('hello'); // arg: undefined
- μ νμ 맀κ°λ³μκ° μλ ν¨μμ μκ·Έλμ²λ λ€μμ²λΌ νμ λ€μ λ¬Όμνλ₯Ό λΆμΈλ€.
type OptionalArgFunc = (string, number?) => void
π¦ ν¨μ ννμβ
π ν¨μλ κ°μ²΄λ€β
- μλ°μ€ν¬λ¦½νΈμμ ν¨μλ
Function
ν΄λμ€μ μΈμ€ν΄μ€μ΄λ€. - λ€μ μ½λμ
add
λ ν¨μλ‘μ λμνλ€λ μλ―Έμ΄λ€.
let add = new Function('a', 'b', 'return a + b');
let result = add(1, 2);
console.log(result); // 3
add
ν¨μλ λ€μκ³Ό κ°μ ννλ‘λ ꡬνν μ μλ€.
let add2 = function(a, b) {
return a + b;
}
console.log(add2(1, 2)); // 3
- μ΄μ²λΌ ν¨μ μ μΈλ¬Έμμ ν¨μ μ΄λ¦μ μ μΈν
function(a, b) { return a + b; }
μ κ°μ μ½λλ₯Ό ν¨μ ννμ(function expression)μ΄ λΌκ³ νλ€.
π μΌλ± ν¨μβ
- νλ‘κ·Έλλ° μΈμ΄κ° μΌλ± ν¨μ(first-class function) κΈ°λ₯μ μ 곡νλ©΄ ν¨μν νλ‘κ·Έλλ° μΈμ΄λΌκ³ νλ€.
- μλ°μ€ν¬λ¦½νΈμ νμ μ€ν¬λ¦½νΈλ μΌλ± ν¨μ κΈ°λ₯μ΄ μμΌλ―λ‘ ν¨μν νλ‘κ·Έλλ° μΈμ΄μ΄λ€.
- μΌλΉ ν¨μλ, ν¨μμ λ³μλ₯Ό ꡬλΆνμ§ μλλ€λ μλ―Έμ΄λ€.
- μλ₯Ό λ€μ΄ λ€μ μ½λμμ
f
λlet
ν€μλκ° μμ μμΌλ―λ‘ λ³μμ΄λ€.f
λ λ³μμ΄λ―λ‘ κ°μ μ μ₯ν μ μλ€. λ³μf
μλa + b
ννμ ν¨μ ννμμ μ μ₯νλ€. - νμ§λ§
f
λ λ³μμ΄λ―λ‘ 2νμ²λΌa - b
ννμ ν¨μ ννμλ μ μ₯ν μ μλ€.
let f = function(a, b) { return a + b; }
f = function(a, b) { return a - b; }
- μ¬λ²
f
κ° λ³μμΈμ§ ν¨μμΈμ§ μ¬μ€μ ꡬλΆν μ μλ€. μ΄κ²μ΄ λ³μμ ν¨μλ₯Ό μ°¨λ³νμ§ μλλ€λ μλ―Έμ΄λ€.
π ννμβ
- νλ‘κ·Έλλ° μΈμ΄μμ ννμ(expression)μ΄λΌλ μ©μ΄λ 리ν°λ΄, μ°μ°μ, λ³μ, ν¨μ νΈμΆ λ±μ΄ 볡ν©μ μΌλ‘ ꡬμ±λ μ½λ ννλ₯Ό μλ―Ένλ€.
- μλ₯Ό λ€μ΄,
1 + 2
λ 1 κ³Ό 2λΌλ 리ν°λ΄κ³Ό λ§μ μ°μ°μ+
λ‘ κ΅¬μ±λ ννμμ΄λ€.
π ν¨μ ννμβ
- μμμ μμ±ν λ³μ
f
μλfunction(a, b) { return a + b; }
λ§μΉ κ°μ²λΌ λμ νλλ°, μ΄function(a, b) { return a + b; }
λΆλΆμ ν¨μ ννμμ΄λΌκ³ νλ€.
π κ³μ°λ²β
- μ»΄νμΌλ¬λ ννμμ λ§λλ©΄ κ³μ°λ²μ μ μ©ν΄ μ΄λ€ κ°μ λ§λλλ° κ³μ°λ²μλ μ‘°κΈν κ³μ°λ²κ³Ό λκΈν(μ§μ°) κ³μ°λ² λ κ°μ§κ° μλ€.
- μ»΄νμΌλ¬κ°
1 + 2
λΌλ ννμμ λ§λλ©΄ μ‘°κΈν κ³μ°λ²μ μ μ©ν΄ 3μ΄λΌλ κ°μ λ§λ€κ³ , μ»΄νμΌλ¬κ°function(a, b) { return a + b; }
λΌλ ν¨μ ννμμ λ§λλ©΄, μ¬λ²a
μb
κ° μ΄λ€ κ°μΈμ§ μ μ μμ΄μ λκΈν κ³μ°λ²μ μ μ©ν΄ κ³μ°μ 보λ₯νλ€.
π ν¨μ νΈμΆ μ°μ°μβ
- μ΄λ€ λ³μκ° ν¨μ ννμμ λ΄κ³ μλ€λ©΄, λ³μ μ΄λ¦ λ€μ ν¨μ νΈμΆ μ°μ°μ
()
λ₯Ό λΆμ¬μ νΈμΆν μ μλ€.
let functionExpression = function(a, b) { return a + b; }
let value = functionExpression(1, 2); // (1, 2): ν¨μ νΈμΆ μ°μ°μ
- μ»΄νμΌλ¬λ ν¨μ νΈμΆλ¬Έμ λ§λλ©΄ μ§κΈκΉμ§ λ―Έλ€λ ν¨μ ννμμ μ‘°κΈν κ³μ°λ²μ μ μ©ν΄ ν¨μ ννμμ κ°μΌλ‘ λ°κΎΌλ€. (
return 1 + 2 => return 3
)
π μ΅λͺ ν¨μβ
- ν¨μ ννμμ μ¬μ€ λλΆλΆ μΈμ΄μμ μΈκΈλλ μ΅λͺ ν¨μ(anonymous function)μ λ€λ₯Έ ννμ΄λ€.
let value = (function(a, b) {return a + b; })(1, 2) // 3
- λ€μ μ½λλ μμ ν μ€κΉμ§ μ½λλ₯Ό μ½κ² λΆμνκ³ μ μΈ μ€λ‘ λλ κ²μ΄λ€.
let value =
(function(a, b) { return a + b })
(1, 2) // 3
- μ»΄νμΌλ¬λ 2νμ μ΅λͺ ν¨μ λΆλΆμ κ²μΌλ₯Έ κ³μ°λ²μ μ μ©ν΄ κ·Έ μνλ‘ λλμ§λ§, 곧λ°λ‘ 3νμ ν¨μ νΈμΆ μ°μ°μλ₯Ό λ§λλ―λ‘ 2νμ ν¨μ λͺΈν΅μ μ‘°κΈν κ³μ°λ²μ μ μ©ν΄ μ΅μ’ μ μΌλ‘ 3μ΄λΌλ κ°μ λ§λ€μ΄ λΈλ€.