12.1 ν¨μλ?
νλ‘κ·Έλλ° μΈμ΄μ ν¨μλ μΌλ ¨μ κ³Όμ μ λ¬Έ(statement)μΌλ‘ ꡬννκ³ μ½λ λΈλ‘μΌλ‘ κ°μΈμ νλμ μ€ν λ¨μλ‘ μ μν κ²μ λλ€. ν¨μ λ΄λΆλ‘ μ λ ₯μ μ λ¬λ°λ λ³μλ₯Ό (parameter), μ λ ₯μ (argument), μΆλ ₯μ λ°νκ°return value)λΌκ³ ν©λλ€.
12.2 ν¨μλ₯Ό μ¬μ©νλ μ΄μ
μ½λμ μ¬μ¬μ© μΈ‘λ©΄, μ μ§λ³΄μμ νΈμμ±μ λμ΄κ³ μ½λμ μ λ’°μ±μ λμ΄λ ν¨κ³Όκ° μμ΅λλ€.
12.3 ν¨μ 리ν°λ΄
리ν°λ΄μ μ¬λμ΄ μ΄ν΄ν μ μλ λ¬Έμ λλ μ½μλ κΈ°νΈλ‘ μ¬μ©ν΄ κ°μ μμ±νλ νκΈ° λ°©μμ λ§ν©λλ€. μ¦ λ¦¬ν°λ΄μ κ°μ μμ±νκΈ° μν νκΈ°λ²μ λλ€. λ°λΌμ ν¨μ 리ν°λ΄λ νκ°λμ΄ κ°μ μμ±νλ©°, μ΄ κ°μ κ°μ²΄μ λλ€. μ¦ ν¨μλ κ°μ²΄μ λλ€.
12.4 ν¨μ μ μ
1. ν¨μ μ μΈλ¬Έ
function add(x, y) {
return x + y
}
2. ν¨μ ννμ
var add = function (x, y) {
return x + y;
}
3. Functionμμ±μ ν¨μ
var add = new Function('x', 'y', 'return x+y')
4. νμ΄ν ν¨μ (ES6)
var add = (x, y) => x + y;
λ³μλ μ μΈ(declaration)νλ€κ³ νμ§λ§ ν¨μλ μ μ(definition)νλ€κ³ ννν©λλ€.
12..4.1 ν¨μ μ μΈλ¬Έ
ν¨μ μ μΈλ¬Έμ ννμμ΄ μλλΌ λ¬Έμ λλ€. ν¨μ μ μΈλ¬Έμ΄ ννμμΈ λ¬Έμ΄λΌλ©΄ undefined λμ ννμμ΄ νκ°λμ΄ μμ±λ ν¨μκ° μΆλ ₯λμ΄μΌ ν©λλ€.
12..4.2 ν¨μ ννμ
ν¨μλ μΌκΈ κ°μ²΄μ΄λ―λ‘ ν¨μ 리ν°λ΄λ‘ μμ±ν ν¨μ κ°μ²΄λ₯Ό λ³μμ ν λΉν μ μμ΅λλ€. μ΄λ¬ν ν¨μ μ μ λ°©μμ ν¨μ ννμ (function expression)μ΄λΌ ν©λλ€. ν¨μ μ μΈλ¬Έμ ννμμ΄ μλ λ¬Έμ΄κ³ , ν¨μ ννμμ ννμμΈ λ¬Έμ λλ€.
var add = function (x, y) {
return x + y;
}
12.4.3 ν¨μ μμ± μμ κ³Ό ν¨μ νΈμ΄μ€ν
ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μμ ν¨μ ννμμΌλ‘ μ μν ν¨μμ μμ± μμ μ λ€λ¦ λλ€. ν¨μ μ μΈλ¬Έμ΄ μ½λμ μ λλ‘ λμ΄ μ¬λ €μ§ κ²μ²λΌ λμνλ JS κ³ μ μ νΉμ§μ ν¨μ νΈμ΄μ€ν (Function hoisting)μ΄λΌκ³ ν©λλ€. ν¨μ νΈμ΄μ€ν κ³Ό λ³μ νΈμ΄μ€ν μ λ―Έλ¬ν μ°¨μ΄κ° μμΌλ―λ‘ μ£Όμν΄μΌ ν©λλ€.
var ν€μλ λ³μμ μΈλ¬Έκ³Ό ν¨μ μ μΈλ¬Έμ λ°νμ μ΄μ μ JSμμ§μ μν΄ λ¨Όμ μ€νλλ μ μμ λμΌνμ§λ§ var ν€μλλ‘ μ μΈλ λ³μλ undefinedλ‘ μ΄κΈ°νλκ³ , ν¨μ μ μΈλ¬Έμ ν΅ν΄ μ묡μ μΌλ‘ μμ±λ μλ³μλ ν¨μ κ°μ²΄λ‘ μ΄κΈ°νλ©λλ€.
ν¨μ ννμμ λ³μμ ν μ₯λλ κ°μ΄ ν¨μ 리ν°λ΄μΈ λ¬Έμ λλ€. λ³μ ν λΉλ¬Έμ κ°μ ν λΉλ¬Έμ΄ μ€νλλ μμ , μ¦ λ°νμμ νκ°λλ―λ‘ ν λΉλ¬Έμ΄ μ€νλλ μμ μ νκ°λμ΄ ν¨μ κ°μ²΄κ° λ©λλ€. μ¦ ν¨μ ννμμΌλ‘ ν¨μλ₯Ό μ μνλ©΄ ν¨μ νΈμ΄μ€ν μ΄ λ°μνλ κ²μ΄ μλλΌ λ³μ νΈμ΄μ€ν μ΄ λ°μν©λλ€. ν¨μ ννμ μ΄μ μ ν¨μ μ°Έμ‘° μ undefinedλ‘ νκ°λ©λλ€.
ν¨μ νΈμ΄μ€ν μ ν¨μλ₯Ό νΈμΆνκΈ° μ μ λ°λμ ν¨μλ₯Ό μ μΈν΄μΌ νλ€λ λΉμ°ν κ·μΉμ 무μλ―λ‘ ν¨μμ μΈλ¬Έ λμ ν¨μννμμ μ¬μ©ν κ²μ κΆμ₯ν©λλ€.
12.4.4 Function μμ±μ ν¨μ
Function μμ±μ ν¨μλ‘ ν¨μλ₯Ό μμ±νλ λ°©μμ μΌλ°μ μ΄μ§ μμΌλ©° λ°λμ§νμ§λ μμ΅λλ€.
12.4.5 νμ΄ν ν¨μ
ES6μμ λμ λ arrow functionμ function ν€μλ λμ arrow (=>)λ₯Ό μ¬μ©ν΄ κ°λ΅ν λ°©λ²μΌλ‘ ν¨μλ₯Ό μ μΈν γ γ μμ΅λλ€. νμ΄ν ν¨μλ νμ μ΅λͺ ν¨μλ‘ μ μν©λλ€.
var add = (x, y) => x + y;
12.5 ν¨μ νΈμΆ
12.5.1 맀κ°λ³μμ μΈμ
맀κ°λ³μλ³΄λ€ μΈμκ° λ λ§μ κ²½μ° μ΄κ³Όλ μΈμλ 무μλλ€. μ΄κ΄΄λ μΈμλ μ묡μ μΌλ‘ arguments κ°μ²΄μ νλ‘νΌν°λ‘ 보κ΄λλ€.
function add(x, y) {
console.log(arguments) //Arguments(3) [2, 5, 10, callee: ƒ, Symbol(Symbol.iterator): ƒ]
VM79:6
return x + y;
}
console.log(add(2, 5, 10)); //7
12.5.2 μΈμ νμΈ
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
12.5.3 맀κ°λ³μμ μ΅λ κ°μ
ECMAScript μ¬μμμλ 맀κ°λ³μμ μ΅λ κ°μμ λν΄ λͺ μμ μΌλ‘ μ ννκ³ μμ§ μμ§λ§, μ½λλ₯Ό μ΄ν΄νλ λ° λ°©ν΄λλ μμμ΄λ―λ‘ μ΄μμ μΈ λ§€κ°λ³μλ 0κ°μ λλ€. μ μΌλ©΄ μ μμλ‘ μ’μ΅λλ€.
12.5.4 λ°νλ¬Έ
ν¨μλ return ν€μλμ ννμ(λ°νκ°)μΌλ‘ μ΄λ€μ§ λ°νλ¬Έμ μ¬μ©ν΄ μ€νκ²°κ³Όλ₯Ό ν¨μ μΈλΆλ‘ λ°νν μ μμ΅λλ€.
12.6 μ°Έμ‘°μ μν μ λ¬κ³Ό μΈλΆ μνμ λ³κ²½
ν¨μ€
12.7 λ€μν ν¨μμ νν
12.7.1 μ¦μ μ€ν ν¨μ
ν¨μ μ μμ λμμ μ¦μ νΈμΆλλ ν¨μλ₯Ό μ¦μ μ€νν¨μλΌκ³ ν©λλ€.
(function() {
var a = 3;
var b = 5
return a + b
}());
12.7.2 μ¬κ· ν¨μ
ν¨μκ° μκΈ° μμ μ νΈμΆνλ κ²μ μ¬κ·νΈμΆμ΄λΌκ³ ν©λλ€. μ¬κ· ν¨μ λ΄μλ μ¬κ·νΈμΆμ λ©μΆ μ μλ νμΆ μ‘°κ±΄μ λ°λμ λ§λ€μ΄μΌ ν©λλ€. λ°λ³΅λ¬Έλ³΄λ€ μ¬κ·ν¨μλ₯Ό μ¬μ©νλ νΈμ΄ λ μ§κ΄μ μΌ λλ§ νμ μ μΌλ‘ μ΄μ©νλ κ²μ μΆμ²ν©λλ€.
12.7.3 μ€μ²© ν¨μ
ν¨μ λ΄λΆμ μ μλ ν¨μλ₯Ό μ€μ²©ν¨μ(nested function) λλ λ΄λΆ ν¨μ(inner function)λΌκ³ ν©λλ€.
12.7.4 μ½λ°± ν¨μ
ν¨μμ 맀κ°λ³μλ₯Ό ν΅ν΄ λ€λ₯Έ ν¨μμ λ΄λΆλ‘ μ λ¬λλ ν¨μλ₯Ό μ½λ°± ν¨μλΌκ³ νλ©°, 맀κ°λ³μλ₯Ό ν΅ν΄ ν¨μμ μΈλΆμμ μ½λ°±νμλ₯Ό μ λ¬λ°μ ν¨μλ₯Ό κ³ μ°¨ν¨μ (High-Order-Function)μ΄λΌκ³ ν©λλ€.
μ½λ°±ν¨μλ ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μ λΏλ§ μλλΌ λΉλκΈ°μ²λ¦¬μ νμ©λλ μ€μν ν¨ν΄μ λλ€.
12.7.5 μμ ν¨μμ λΉμμ ν¨μ
λΆμ ν¨κ³Όκ° μλ ν¨μλ₯Ό μμ ν¨μ (pure funciton), μΈλΆ μνμ μμ‘΄νκ±°λ μΈλΆ μνλ₯Ό λ³κ²½νλ, μ¦ λΆμ ν¨κ³Όκ° μλ ν¨μλ₯Ό λΉμμ ν¨μ(impure function)μ΄λΌκ³ ν©λλ€.
ν¨μν νλ‘κ·Έλλ°μ κ²°κ΅ μμν¨μλ₯Ό ν΅ν΄ λΆμν¨κ³Όλ₯Ό μ΅λν μ΅μ ν΄ μ€λ₯λ₯Ό νΌνκ³ νλ‘κ·Έλ¨μ μμ μ λμ΄λ €λ λ Έλ ₯μ μΌνμ΄λΌ ν μ μμ΅λλ€.
Reference: λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive