μλ°μ€ν¬λ¦½νΈμ ν¨μ(function)λ λ§€μ° νΉλ³ν μ‘΄μ¬μ λλ€. μμΈν μμλ΄ μλ€!
ν¨μλ μ΄λ¦κ³Ό λ§€κ°λ³μλ₯Ό κ°κ³ , νμν λμ νΈμΆνμ¬ μ½λ λΈλ‘μ μμ±ν λ¬Έλ€μ μΌκ΄μ μΌλ‘ μ€νν μ μμ΅λλ€.
μ¦, νΉμ μμ μ μννκΈ° μν΄ νμν λ¬Έ(statement)μ μ§ν©μ μ μν μ½λ λΈλ‘μ΄ ν¨μμ λλ€. μ΄ ν¨μλ μλμ κ°μ κΈ°λ₯μ ν μ μμ΅λλ€.
- λ°λ³΅μ μΌλ‘ μμ±λλ μ½λλ₯Ό ν¨μλ‘ μ μνμ¬
μ¬μ¬μ©- ν¨μμ μμ΄λ΄ν°ν°λ μ¬μ¬μ©μ±μ μμ΅λλ€.
- κ°μ²΄ μμ±
- κ°μ²΄μ νμ μ μ(λ©μλλ‘ λμ)
- μ 보 μλ
- ν΄λ‘μ
- λͺ¨λν
κΈ°λ₯μ 보면 μ΄μνμ£ ? λ§μΉ ν¨μκ° κ°μ²΄μ²λΌ μ°μΌ μ μλ κ² κ°μμ. λλκ²λ μλ°μ€ν¬λ¦½νΈμ ν¨μλ νΈμΆν μ μλ κ°μ²΄(First-Class Object)λ‘μ μΌκΈ κ°μ²΄λΌκ³ λΆλ¦½λλ€. λ³μλ κ°μ²΄, λ°°μ΄μ νλ‘νΌν°(λ©μλ)λ‘ μ μν μ μκ³ , λ€λ₯Έ ν¨μμ μ λ¬νλ μΈμλ‘λ μ¬μ©ν μ μμΌλ©°, λ€λ₯Έ ν¨μμ λ°νκ°μ΄ λ μλ μμ΅λλ€.
κ·Έλ°λ°, μΌκΈ κ°μ²΄κ° λμ£ ?
ν¨μλ μΌλ° κ°μ²΄κ° μλλΌ μΌκΈ κ°μ²΄(First-Class Object) λ‘ μ·¨κΈλ©λλ€.
- μλμ κ°μ 쑰건μ λ§μ‘±νλ©΄ μΌκΈ κ°μ²΄λΌκ³ ν΄μ.
- 무λͺ 리ν°λ΄λ‘ μμ±(λ°νμμ μμ±μ΄ κ°λ₯νλ€λ μ΄μΌκΈ°μμ)ν μ μμ΅λλ€.
- λ³μ, κ°μ’ μλ£κ΅¬μ‘°(Object, Array, Set, Map λ±)μ μ μ₯ν μ μμ΅λλ€.
- ν¨μμ λ§€κ°λ³μ(Parameter)λ‘ μ λ¬ν μ μμ΅λλ€.
- ν¨μμ λ°ν(return) κ°μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
- μμ μ½λλ₯Ό 보면 λ μ νν μκ² μ£ ?
// 1λ², 2λ² μ‘°κ±΄μ μΆ©μ‘±λ©λλ€. const increase = function (num) { return ++num; } console.log(increase); // Ζ (num) { return ++num; } console.log(increase(3)); // 4 // 3λ² μ‘°κ±΄μ μΆ©μ‘±λ©λλ€. const predicates = { increase }; console.log(predicates); // {increase: Ζ} console.log(predicates.increase(3)); // 4 // 3λ², 4λ² μ‘°κ±΄μ μΆ©μ‘±λ©λλ€. function makeCounter(predicates) { let num = 0; return function() { num = predicates(num); return num; }; } const increaser = makeCounter(predicates.increase); console.log(increaser()); // 1 console.log(increaser()); // 2
ν¨μλ μΌκΈ κ°μ²΄λΌλ κ²μ ν¨μλ₯Ό κ°μ²΄μ λμΌνκ² μ¬μ©ν μ μλ€λ μλ―Έμ
λλ€. μ¦, ν¨μλ κ°μ κ°μ©ν μ μλ κ³³μ΄λΌλ©΄ 리ν°λ΄λ‘ μ μν μ μκ³ λ°νμμ ν¨μ κ°μ²΄λ‘ νκ°λλ κ²μ΄μ£ .
ν¨μ κ°μ²΄μ μΌλ° κ°μ²΄λ μλμ κ°μ μ°¨μ΄κ° μμ΅λλ€.
- μκ΄νΈ(
())λ₯Ό μ¬μ©ν νΈμΆμΈλ°, μΌλ° κ°μ²΄λ νΈμΆμ΄ λΆκ°λ₯νμ§λ§ ν¨μ κ°μ²΄λ νΈμΆν μ μμ΅λλ€. - ν¨μ κ°μ²΄μλ μΌλ° κ°μ²΄μ μλ ν¨μ κ³ μ νλ‘νΌν°κ° μ‘΄μ¬ν©λλ€.
ν¨μλ μΌλ° κ°μ²΄μ²λΌ νλ‘νΌν°λ₯Ό μμ ν μ μμ΅λλ€. μ¦, Object.getOwnPropertyDescriptorsλ₯Ό μ¬μ©ν μ μμ£ . ν¨μ κ°μ²΄κ° μμ ν νλ‘νΌν°λ₯Ό μ΄ν΄λ³ΌκΉμ?
TODO : callee νλ‘νΌν° λλ½λμμ 2021-10-01
- arguments νλ‘νΌν°
- arguments κ°μ²΄λ ν¨μ νΈμΆ μ μ λ¬λ μΈμ(argument)λ€μ μ 보λ₯Ό λ΄κ³ μλ μν κ°λ₯(Iterable)ν μ μ¬ λ°°μ΄ κ°μ²΄μ λλ€.
- ν¨μ λ΄λΆμμ μ§μ λ³μμ²λΌ μ¬μ©λλ©° μΈλΆμμλ μ°Έμ‘°ν μ μμ΅λλ€.
- ES3λΆν° νμ€μμ νμ§λμ΄ μ¬μ©μ΄ κΆμ₯λμ§ μμ΅λλ€.
- μλ°μ€ν¬λ¦½νΈλ ν¨μμ λ§€κ°λ³μμ μΈμμ κ°μκ° μΌμΉνλμ§ νμΈνμ§ μμ μλ¬κ° λ°μνμ§ μμ΅λλ€.
- μ§μ λ κ°μλ³΄λ€ μ μ κ²½μ° : λ§€κ°λ³μλ undefinedλ‘ μ΄κΈ°νλ©λλ€.
- μ§μ λ κ°μλ³΄λ€ λ§μ κ²½μ° : μ묡μ μΌλ‘ arguments κ°μ²΄μ μμλλ‘ μ μ₯(μν κ°λ₯ν μ μ¬ λ°°μ΄ κ°μ²΄μ΄λ―λ‘)λ©λλ€.
- μ΄λ¬ν μ΄μ λ‘
κ°λ³ μΈμ ν¨μλ₯Ό ꡬνν λ μ μ©ν©λλ€.
- λ¨, μ μ¬ λ°°μ΄ κ°μ²΄λ λ°°μ΄μ΄ μλλ―λ‘ λ°°μ΄ λ©μλλ₯Ό μ¬μ©ν μ μμΌλ μλμ λ°©λ²μΌλ‘ κ°μ νΈμΆν μ μμ΅λλ€.
Function.prototype.call, Function.prototype.applyμ¬μ©νκΈ°. μ°Έμ‘°1
function sum(){ // const array = Array.prototype.slice.apply(arguments); const array = Array.prototype.slice.call(arguments); return array.reduce(function (pre, cur){ return pre + cur; }, 0); } console.log(sum(1, 2, 3, 4, 5)); // 15
- ES6μ Rest νλΌλ―Έν°
function sum(...args){ return args.reduce((pre, cur) => pre + cur, 0); } console.log(sum(1, 2, 3, 4, 5)); // 15
- caller νλ‘νΌν°
- λΉνμ€ νλ‘νΌν°λ‘ ν¨μ μμ μ νΈμΆν ν¨μλ₯Ό κ°λ¦¬ν΅λλ€.
- length νλ‘νΌν°
- ν¨μλ₯Ό μ μν λ μ μΈν λ§€κ°λ³μμ κ°μλ₯Ό κ°λ¦¬ν΅λλ€.
arguments κ°μ²΄μ length νλ‘νΌν°μν¨μ κ°μ²΄μ length νλ‘νΌν°μ κ°μ λ€λ₯Ό μ μμ΅λλ€.- μ μμ κ²½μ° μΈμ(argument)μ κ°μ, νμμ κ²½μ° λ§€κ°λ³μ(parameter)μ κ°μλ₯Ό κ°λ¦¬ν€κΈ° λλ¬Έμ΄μ§μ.
- name νλ‘νΌν°
- ES6μμ νμ€μ΄ λμμΌλ©° ν¨μ μ΄λ¦μ λνλ λλ€. ES5μ ES6μ λμμ΄ μλ‘ λ€λ¦ λλ€.
- μ΅λͺ
ν¨μ ννμμ κ²½μ°
ES5λ λΉ λ¬Έμμ΄μ,ES6λ ν¨μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ μλ³μλ₯Ό κ°μΌλ‘ κ°μ΅λλ€.
- proto μ κ·Όμ νλ‘νΌν°
[[Prototype]]λ΄λΆ μ¬λ‘―μ΄ κ°λ¦¬ν€λ νλ‘ν νμ κ°μ²΄μ μ κ·ΌνκΈ° μν΄ μ¬μ©ν©λλ€.
- prototype νλ‘νΌν°
- μμ±μ ν¨μλ‘ νΈμΆν μ μλ κ°μ²΄λ‘ constructorλ§μ΄ μμ ν©λλ€.
- μΌλ° κ°μ²΄μ μμ±μ ν¨μλ‘ νΈμΆν μ μλ non-constructorλ prototype νλ‘νΌν°κ° μ‘΄μ¬νμ§ μμ΅λλ€.
- μ¦, ν¨μκ° κ°μ²΄λ₯Ό μμ±νλ μμ±μ ν¨μλ‘ νΈμΆλ λ, μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ κ±°μ£ .
__proto__μ [[Prototype]]μ λν΄μλ νλ‘ν νμ
νμ΄μ§λ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ.
ν¨μλ₯Ό μ μνλ λ°©μμ λ€ κ°μ§(ES6μμ μΆκ°λμμ΅λλ€)λ‘ λΆλ₯ν μ μμ΅λλ€.
-
ν¨μ μ μΈλ¬Έ(Function Declaration) :
functionν€μλμ ν¨μλͺ , λ§€κ°λ³μ λͺ©λ‘, ν¨μ λͺΈμ²΄λ‘ ꡬμ±λ©λλ€.function sum(a, b){ return a + b; } console.log(sum(1, 2)); // 3
- ν¨μ μ μΈλ¬Έμ ν¨μλͺ μ μλ΅ν μ μμ΅λλ€.
- μλ°μ€ν¬λ¦½νΈμ ν¨μλ λ§€κ°λ³μμ νμ
μ κΈ°μ νμ§ μμΌλ©°, λ§€κ°λ³μλ₯Ό λκΈ°μ§ μμΌλ©΄ undefinedλ‘ μ μΈλ©λλ€.
function sum(a, b){ return a + b; } console.log(sum()); // NaN
- ν¨μ λͺΈμ²΄λ ν¨μ νΈμΆ μ μ€νλλ λ¬Έλ€μ μ§ν©λλλ€. μ€κ΄νΈ(
{})λ‘ κ°μΈμ§λ©°returnλ¬ΈμΌλ‘ ν¨μ μ€νμ κ²°κ³Ό(return value)λ₯Ό λ°νν μ μμ΅λλ€.
-
ν¨μ ννμ(Function Expression) : ν¨μ 리ν°λ΄ λ°©μμΌλ‘ ν¨μλ₯Ό μ μνκ³ λ³μμ ν λΉν©λλ€. μ’ λ₯κ° λ κ°μ§ μ‘΄μ¬νλλ°, μμ λ‘ μ΄ν΄λ΄ λλ€.
- κΈ°λͺ
ν¨μ ννμ : ν¨μλͺ
μ
μ§μ νλλ°©λ²μ λλ€.const foo = function sum(a, b){ return a + b; } console.log(foo(1, 2)); // 3 console.log(sum(1, 2)); // ReferenceError: multiply is not defined
- μ΄μ²λΌ λ³μμ ν λΉν μ μλ μ΄μ λ ν¨μκ°
μΌκΈ κ°μ²΄λ‘ νκ°λκΈ° λλ¬Έμ λλ€. ν΄λΉ λ³μλ μμ κ°μ΄ μλλΌ ν λΉλ ν¨μλ₯Ό κ°λ¦¬ν€λ μ°Έμ‘°κ°μ μ μ₯νλ©°, ν¨μλͺ μ΄ μλ λ³μλͺ μΌλ‘ ν¨μλ₯Ό νΈμΆν μ μμ΅λλ€. - ν¨μ νΈμ΄μ€ν κ³Ό μ°κ΄λ νλͺ©μ΄λ―λ‘ μλμμ μμΈν λ€λ£Ήλλ€.
- μ΄μ²λΌ λ³μμ ν λΉν μ μλ μ΄μ λ ν¨μκ°
- μ΅λͺ
ν¨μ ννμ : ν¨μλͺ
μ
μλ΅νλλ°©λ²μ λλ€.// ES5μ ν¨μ ννμ const bar = function(a, b){ return a + b; } const foo = bar; console.log(bar(1, 2)); // 3 console.log(foo(1, 2)); // 3
- κΈ°λͺ
ν¨μ ννμ : ν¨μλͺ
μ
-
Function μμ±μ ν¨μ : μ¬μ©νμ§ μμ΅λλ€!
const sum = new Function('a', 'b', 'return a + b'); console.log(sum); // 3
- κ·Έλ¦¬κ³ νμ¬ λͺ¨λ λΈλΌμ°μ μμλ μλμ κ°μ μ€λ₯κ° λ°μνλ€μ! :
EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src chrome://resources chrome://test 'self' 'unsafe-inline' https:".
- κ·Έλ¦¬κ³ νμ¬ λͺ¨λ λΈλΌμ°μ μμλ μλμ κ°μ μ€λ₯κ° λ°μνλ€μ! :
-
νμ΄ν ν¨μ : ES6μ λ±μ₯ν μλ‘μ΄ ν¨μ μ μΈ λ°©μμΌλ‘, function ν€μλ λμ νμ΄ν(arrow,
=>)λ₯Ό μ¬μ©ν΄ λ κ°λ΅νκ² νκΈ°ν μ μμ΅λλ€. νμμ΅λͺ ν¨μλ‘ μ μν©λλ€.// ES6μ νμ΄ν ν¨μ : μ΅λͺ ν¨μλ‘ μμ±ν©λλ€. const bar = (a, b) => { return a + b; } console.log(bar(1, 2)); // 3
- λ¬Έλ²μ΄ μ‘°κΈ λ¬λΌμ§μ μ μΈνλ©΄ νΉμ΄ν μ μ΄ μλλ°... λ΄λΆ λμμ΄ λ§μ΄ λ³κ²½λμμ΅λλ€. μμΈν κ²μ ES6μ ν¨μμμ μ’ λ μμΈν λ€λ€λ³΄μ£ .
ν¨μλ₯Ό μ μνλ λ°©μμ΄ λ€ κ°μ§λ λ©λλ€. κ·Έλ¬λ λ°ννλ κ²°κ³Όλ λμΌνλ€μ? λ체 λκ° λ€λ₯΄κΈΈλ μ΄λ κ² λλ μ§ κ±ΈκΉμ? μ¬κΈ°μ ν¨μ νΈμ΄μ€ν μ΄ λ±μ₯ν©λλ€.
μλ°μ€ν¬λ¦½νΈλ λͺ¨λ μ μΈμ νΈμ΄μ€ν ν©λλ€!
μ°μ μμ λ₯Ό λ΄ μλ€!
console.log(sum(1, 2)); // 3
function sum(a, b){
return a + b;
}μ€, μλνλ€μ? κ·ΈλΌ μ ν¬λ μ΄λ κ² μκ°ν μ μμ΅λλ€. νΈμ΄μ€ν μ΄ λ°μνλꡬλ!
μλ°μ€ν¬λ¦½νΈλ λͺ¨λ μ μΈλ¬Έμ΄ μ μΈλκΈ° μ΄μ μ μ°Έμ‘°κ° κ°λ₯ν©λλ€. ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ ν¨μκ° νκ°λλ κ³Όμ μ μλμ κ°μ΅λλ€.
- μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μ€ν¬λ¦½νΈκ° λ‘λ©λλ μμ μ μ΄κΈ°ν ν©λλ€.
- μ΄κΈ°νλ ν¨μλ₯Ό λ³μ κ°μ²΄(Variable Object, VO)μ μ μ₯ν©λλ€.
μ΄λ κ² ν¨μμ μ μΈ, μ΄κΈ°ν, ν λΉμ΄ ν νλ‘μΈμ€μμ μ΄λ£¨μ΄μ§λ κ²μ λλ€! κ·ΈλΌ λΉμ°ν ν¨μ μ μΈμ μμΉμ μκ΄ μμ΄ μ΄λ κ³³μμλ νΈμΆμ΄ κ°λ₯νμ£ .
const result = sum(1, 2);
console.log(sum(1, 2)); // ReferenceError: sum2 is not defined
const sum = function(a, b){
return a + b;
}κ·Έλ μ§λ§ ν¨μ ννμμ ν¨μ νΈμ΄μ€ν μ΄ μλ λ³μ νΈμ΄μ€ν μ΄ λ°μν©λλ€. λ³μ νΈμ΄μ€ν μ ν¨μ νΈμ΄μ€ν κ³Ό κ·Έ κ³Όμ μ΄ λ€λ¦ λλ€. μλλ₯Ό λ³ΌκΉμ?
- ν¨μ ννμμ
λ°νμ(Runtime)μ ν΄μλκ³ μ€νλλ―λ‘ λ³μ μμ±κ³Ό μ΄κΈ°ν, ν λΉμ΄ λΆλ¦¬λμ΄ μ§νλ©λλ€. - νΈμ΄μ€ν λ λ³μλ undefinedλ‘ μ΄κΈ°νλ©λλ€.
- μ€μ λ‘ κ°μ ν λΉμ
ν λΉλ¬Έμμ μ΄λ£¨μ΄μ§λλ€!
ν¨μ νΈμ΄μ€ν μ ν¨μ νΈμΆ μ μ λ°λμ ν¨μλ₯Ό μ μΈν΄μΌ λλ€λ κ·μΉμ 무μνκΈ° λλ¬Έμ μ½λμ ꡬ쑰μ κ²°ν¨μ΄ λ°μν μ μμΌλ―λ‘ ν¨μ ννμμ μ¬μ©νλλ‘ κΆμ₯ν©λλ€.
ν¨μλ₯Ό κ°λ¦¬ν€λ μλ³μμ ν¨μ νΈμΆ μ°μ°μ(
())λ‘ νΈμΆν©λλ€.
μ°λ¦¬λ λ§μ ν¨μλ₯Ό νΈμΆν΄ μμ΅λλ€. μ νν λͺ μΉμ λͺ°λΌλ μλΉν μ§κ΄μ μΌλ‘ λ€κ°μ€λ ννμ΄μ£ . κ·Έλ¦ΌλΆν° λ³ΌκΉμ?
λ§€κ°λ³μλ ν¨μ λͺΈμ²΄ λ΄λΆμμ λ³μμ λμΌνκ² μ·¨κΈλ©λλ€. λ§€κ°λ³μ(Parameters)λ μΈμ(Arguments)μ μ°κ²°λ©λλ€. μλ°μ€ν¬λ¦½νΈλ μ΄λ₯Ό μ²λ¦¬νλ λ°©μμ΄ λ€λ₯Έ μΈμ΄μ λ¬λΌμ. λ€λ₯Έ μΈμ΄μμλ λ§€κ°λ³μμ μΈμκ° 1:1 λμ λκ±°λ, νμν μΈμλ₯Ό λκ²¨μ£Όμ§ μμΌλ©΄ μλ¬λ₯Ό λ
λλ€.
κ·Έμ λ°ν΄ μλ°μ€ν¬λ¦½νΈλ μ묡μ μΌλ‘ λ§€κ°λ³μκ° μμ±λκ³ , undefinedλ‘ μ΄κΈ°νλμ΄ ν¨μ νΈμΆ μ μ λ ₯ν μΈμμ μμλλ‘ ν λΉλλ ννμ λλ€.
νΉμ§μ λμ΄ν΄λ³΄λ©΄ μλμ κ°μμ.
- ν¨μλ λ§€κ°λ³μμ μΈμμ κ°μκ° μΌμΉνλμ§ μ²΄ν¬νμ§ μμ΅λλ€.
- μΈμκ° ν λΉλμ§ μμ λ§€κ°λ³μλ undefinedκ° λ©λλ€!
function sum(a, b){ console.log(a, b); // 1, undefined return a + b; } console.log(sum(1)); // NaN
- μΈμκ° λ§€κ°λ³μλ³΄λ€ λ§μ κ²½μ° μλ¬ μμ΄ λ¬΄μλ©λλ€.
funtion sum(a, b){ return a + b; } console.log(sum(1, 2, 3)); // 3
- μ€, κ·Έλ λ€κ³ μ΄κ³Όν μΈμκ° μ¬λΌμ§λ κ²μ μλλλ€. νΉμ΄νκ²λ argumentsλΌλ κ°μ²΄μ νλ‘νΌν°λ‘ 보κ΄λκΈ° λλ¬Έμ΄μ£ .
function sum(a, b{ console.log(arguments); // Arguments(3)Β [1, 2, 3, caljames: Ζ, Symbol(Symbol.iterator): Ζ] } sum(1, 2, 3);
- arguments κ°μ²΄λ
κ°λ³ μΈμ ν¨μλ₯Ό ꡬνν λ μ μ©ν©λλ€. λ€μ μμΈν λ€λ£¨λ μμ¬νμΈμ!
- arguments κ°μ²΄λ
- μλ°μ€ν¬λ¦½νΈλ λ§€κ°λ³μ νμ
μ μ¬μ μ μ§μ ν μ μμ΅λλ€.
- κ·Έλ κΈ°μ νμ°μ μΌλ‘ μ μ ν μΈμκ° μ λ¬λμλμ§ νμΈν΄μΌ ν©λλ€. μ΄λ₯Ό 무μνλ©΄ ν¨μ νΈμΆμ λν μλ¬κ°
λ°νμμ λ°μνκ² λλκΉμ. - κΈ°λ³Έμ μΌλ‘
λ¨μΆ νκ°λ₯Ό μ¬μ©νμ¬ κΈ°λ³Έκ°μ λ§μ΄ ν λΉνμΌλ, ES6μμλ λ§€κ°λ³μμ κΈ°λ³Έκ°μ μ§μ ν μ μκ² λμμ΅λλ€.
- κ·Έλ κΈ°μ νμ°μ μΌλ‘ μ μ ν μΈμκ° μ λ¬λμλμ§ νμΈν΄μΌ ν©λλ€. μ΄λ₯Ό 무μνλ©΄ ν¨μ νΈμΆμ λν μλ¬κ°
- λ§€κ°λ³μμ κ°μμλ μ νμ΄ μμ΅λλ€. λ§λ μλμ§λ§ κ°μ²΄ ννλ‘ κ΄λ¦¬λλκΉμ. λ¬Όλ‘ λ§€κ°λ³μμ κ°μλ μ΅μνμΌλ‘ ν΄μΌνλ©°, μ΅λλ‘λ 3κ°κΉμ§ κΆμ₯νκ³ μμ΅λλ€.
- λ§μ½ λ§μ λ§€κ°λ³μλ₯Ό λκ²¨μΌ νλ μν©μ΄λΌλ©΄, κ°μ²΄ ννλ‘ μ λ¬ν΄λ³΄μΈμ!
function sum(expr){ return expr.a + expr.b + expr.c + expr.d + expr.e; } console.log(sum({a:1, b:2, c:3, d:4, e:5}));
- λ¨, κ°μ²΄λ₯Ό μΈμλ‘ μ¬μ©νλ©΄ μ°Έμ‘° κ°μ λ°λΌλ³΄κ² λλ―λ‘ μλ³Έ κ°μ²΄μ λ³νμ΄ κ°ν΄μ§λ μ£Όμν΄μ£ΌμΈμ.
- λ§μ½ λ§μ λ§€κ°λ³μλ₯Ό λκ²¨μΌ νλ μν©μ΄λΌλ©΄, κ°μ²΄ ννλ‘ μ λ¬ν΄λ³΄μΈμ!
μ€, μ€μν λ΄μ©μ΄ λμλ€μ. λ§€κ°λ³μλ‘ κ°μ²΄λ₯Ό λκΈ°λ©΄ μλ³Έ κ°μ²΄μ λ³νμ΄ κ°ν΄μ§λ€κ΅¬μ? μ΄κ² λ¬΄μ¨ μΌμ΄μ£ ?
κ·Έλλ λ€νν, μ°λ¦¬λ μμ κ°κ³Ό κ°μ²΄κ° μ΄λ»κ² λμνκ³ λ©λͺ¨λ¦¬μ ν λΉλλμ§ μ΄ν΄νκ³ μμ΅λλ€. κ·Έλ¦Όκ³Ό μμ λ₯Ό 보면μ μ΄ ν¨μ νΈμΆ μν©μ μμΈν μκ°ν΄λ³ΌκΉμ?
μμ κ°μΈ λ³μ numμ λκΈ°λ©΄ λ§€κ°λ³μλ κ°μ 볡μ¬νλ―λ‘ λ§€κ°λ³μμ μΈμκ° μλ‘ λ€λ¦ λλ€.
κ°μ²΄μΈ λ³μ objλ₯Ό λκΈ°λ©΄ λ§€κ°λ³μλ μ°Έμ‘° κ°μ 볡μ¬νλ―λ‘ λ§€κ°λ³μμ μΈμκ° μλ‘ κ°μ΅λλ€.
ν¨μλ₯Ό νΈμΆνλ©΄μ λ§€κ°λ³μμ κ°μ μ λ¬νλ λ°©μμ κ°μ μν νΈμΆ(Call by Value), μ°Έμ‘°μ μν νΈμΆ(Call by Reference)μ΄λΌκ³ ν©λλ€. κ²°κ΅ λμμ κ°μ μ λ¬ν¨μ μμ΄ λμΌνμ§λ§μ. μλ μμ λ₯Ό λ΄
μλ€.
function changeVal(primitive, obj) {
primitive += 100;
obj.name = 'amy';
obj.age = 16;
console.log(primitive); // 200
}
const num = 100;
const obj = {
name: 'james',
age: 24
};
console.log(num); // 100
console.log(obj); // {name: 'james', age: 24}
changeVal(num, obj);
console.log(num); // 100
console.log(obj); // {name: 'amy', age: 16}κ²°κ΅, μμ κ° numμ λ³κ²½μ΄ λΆκ°λ₯νλ―λ‘ μ¬ν λΉμ ν΅ν΄ μλ‘μ΄ μμ κ°μΌλ‘ κ΅μ²΄νμ΅λλ€. κ°μ²΄ objλ λ³κ²½μ΄ κ°λ₯νλ―λ‘ μ¬ν λΉ μμ΄ μ§μ κ°μ κ΅μ²΄νμ£ . μ¬κΈ°μ μ€μν κ²μ μμ κ°μ λ§€κ°λ³μλ‘ μ λ¬νλ©΄ μλ³Έμ κ°μ νΌμνμ§ μμ λΆμ ν¨κ³Όκ° μΌμ΄λμ§ μκ³ , κ°μ²΄λ μΌμ΄λλ€λ κ²μ
λλ€. λΉμ°ν μλ³Έ κ°μ²΄κ° νΌμλλ©΄ λ§μ λ¬Έμ κ° μκΈ°κ² μ£ ? μ΄μ λν ν΄κ²°μ±
μΌλ‘ κ°μ²΄λ₯Ό λΆλ³ κ°μ²΄(Immutable Object) λ‘ λ§λ€κ±°λ, κΉμ 볡μ¬(Deep Copy) νλ λ°©λ²μ΄ μ‘΄μ¬ν©λλ€.
μ΄λ κ² μΈλΆ μνλ₯Ό λ³κ²½νμ§ μκ³ , λ μμ‘΄νμ§ μλ ν¨μλ₯Ό μμ ν¨μλΌκ³ ν©λλ€. μ, λ λͺ¨λ₯΄λ λ¨μ΄κ° λμκ΅°μ? κΈ° μ£½μ§ λ§κ³ μλμμ μ΄ν΄λ΄
μλ€!
λΆμ ν¨κ³Ό(Side Effect)κ° μλ ν¨μλ₯Ό μμ ν¨μ(Pure Function), λΆμ ν¨κ³Όκ° μλ ν¨μλ₯Ό λΉμμ ν¨μ(Impure Function)λΌκ³ ν©λλ€.
λ°λ‘ μμ λ₯Ό ν΅ν΄ μμ ν¨μ, λΉμμ ν¨μλ₯Ό μ λλ‘ μ§μ΄λ΄ μλ€.
-
μμ ν¨μ : μμ ν¨μκ° λ°νν κ²°κ³Όλ₯Ό λ³μμ μ¬ν λΉνλ―λ‘ μΆμ μ΄ μ½μ΅λλ€.
let count = 0; // μμ ν¨μ function increase(n) { // μΈλΆ μνμ μμ‘΄μ μ΄μ§ μκ³ μΈλΆ μνλ₯Ό λ³κ²½νμ§λ μλλ€. return ++n; } count = increase(count); console.log(count); // 1 count = increase(count); console.log(count); // 2
-
λΉμμ ν¨μ : μΈλΆ μν(count)λ₯Ό λ³κ²½νλ μν λ³νλ₯Ό μΆμ νκΈ° νλ€μ΄μ.
let count = 0; // λΉμμ ν¨μ function increase() { // μΈλΆ μνμ μμ‘΄νλ©° μΈλΆ μνλ₯Ό λ³κ²½νλ€. return ++count; } increase(); console.log(count); // 1 increase(); console.log(count); // 2
λΉμ°ν, μμ 볡μ¬λ κ°μ²΄λ₯Ό μΈμλ‘ λκΈ°λ©΄ μΈλΆ μνμ μμ‘΄νκ² λ©λλ€. κ·Έλμ λΉμμ ν¨μκ° λλ, μμμ μΈκΈν ν΄κ²°μ± μ μ¬μ©νμ¬ μμ ν¨μλ‘ μμ±νκΈ° λ°λλλ€.
λ§μ§λ§μΌλ‘, μμ ν¨μμ νΉμ§μ μ΄ν΄λ³ΌκΉμ?
- λΆμ ν¨κ³Όλ₯Ό μ΅λν μ΅μ νμ¬ μ€λ₯λ₯Ό νΌνλ€.
- νλ‘κ·Έλ¨μ μμ μ±μ λμΈλ€.
μ΄λ° νλ‘κ·Έλλ° ν¨λ¬λ€μμ ν¨μν νλ‘κ·Έλλ°μ΄λΌκ³ ν©λλ€.
returnν€μλμ ννμμΌλ‘ λ°νλ¬Έμ λ§λ€κ³ ν¨μ μΈλΆλ‘ λ°νν μ μμ΅λλ€.
μμΈνκ² μ€λͺ ν νμλ μμ§λ§, μ§κ³ λμ΄κ°μΌ νλ λΆλΆμ΄ μμ΅λλ€.
ν¨μ νΈμΆμ ννμμ΄λΌλ κ²μ κΈ°μ΅νμλμ? ν¨μ νΈμΆ ννμμ return ν€μλκ° λ°νν λ°ν κ°μΌλ‘ νκ°λ©λλ€.
λ°νλ¬Έ(return λ¬Έ)μ μλμ κ°μ μν μ ν©λλ€.
- ν¨μμ μ€νμ μ€λ¨νκ³ μΈλΆλ‘ κ²°κ³Όκ°μ λ°νν©λλ€.
function sum(a, b){ return a + b; console.log(a, b); // μ€νλμ§ μμ΅λλ€. } sum(1, 2); // 3μΈ ν¨μ νΈμΆ ννμμ λλ€.
- λ°νλ¬Έμ μ§μ νμ§ μκ±°λ μλ΅νλ©΄ undefinedλ₯Ό λ°νν©λλ€.
function foo(){ return; } function bar(){ } console.log(foo()); // undefined console.log(bar()); // undefined
- return ν€μλλ₯Ό μ¬μ©ν λ μ€λ°κΏ(κ°νλ¬Έμμ μ¬μ©)μ νλ€λ©΄ ASI(μΈλ―Έμ½λ‘ μλ μ½μ
κΈ°λ₯)μ μν΄ undefinedκ° λ°νλ©λλ€.
function sum(a, b){ return a + b; } /* // μ€μ νκ° function sum(a, b){ return; a + b; } */ console.log(sum(1, 2)); // undefined
- λ°νλ¬Έμ ν¨μμ λͺΈμ²΄μμλ§ μ¬μ©ν μ μμ΅λλ€. λλ¨Έμ§λ
SyntaxError: Illegal return statementμλ¬κ° λ°μν©λλ€.- Node.jsλ λͺ¨λ μμ€ν
μΌλ‘
νμΌ μ€μ½νλ₯Ό κ°μ§λλ€. μ¦, returnμ μ μμμ μ¬μ©ν΄λ μλ¬κ° λμ§λ μμμ.
- Node.jsλ λͺ¨λ μμ€ν
μΌλ‘
ν¨μλ μ¬λ¬ ννκ° μ‘΄μ¬ν©λλ€.
ν¨μ μ μ λ°©μ, μμ/λΉμμ ν¨μλ λ°°μ μ΅λλ€. κ·Έλ°λ° λ λ¬΄μ¨ μ’ λ₯κ° μλ κ±ΈκΉμ?
μ΄λ ν¨μμ μ¬μ©μ²μ μμ΅λλ€. νλμ© μ΄ν΄λ³ΌκΉμ?
-
μ¦μ μ€ν ν¨μ(Immediately Invoked Function Expression, IIFE)
- ν¨μ μ μΈκ³Ό λμμ μ¦μ νΈμΆλλ ν¨μλ‘, λ€μ νΈμΆν μ μμ΅λλ€.
- κΈ°λͺ ν¨μλ‘ μμ±ν΄λ μκ΄ μμΌλ, λ€μ μ¬μ©ν μ μμΌλ―λ‘ μ΅λͺ ν¨μλ‘ μμ±νλ κ²μ΄ μΌλ°μ μ λλ€.
- λ°λμ κ·Έλ£Ή μ°μ°μ(
())λ‘ κ°μΈμΌ ν©λλ€. κ·Έ μ΄μ λ ν¨μ μ μΈλ¬Έμ νμκ³Ό μΌμΉνμ§ μκΈ° λλ¬Έμ΄λ©°, ASI κΈ°λ₯ λν μλ¬λ₯Ό λ°μμν΅λλ€.// SyntaxError: Function statements require a function name function (){ // κΈ°λ₯ μ μ }(); // SyntaxError: Unexpected token ')' function sum(){ // κΈ°λ₯ μ μ }();
- μ¦μ μ€ν ν¨μλ μ΄λ κ² μμ±ν μ μμ΅λλ€.
// 1 (function() { // κΈ°λ₯ μ μ }()); // 2 (function(){ // κΈ°λ₯ μ μ })(); // 3 !function(){ // κΈ°λ₯ μ μ }(); // 4 +function(){ // κΈ°λ₯ μ μ }();
- μΌλ° ν¨μμ²λΌ κ°μ λ°νν μ μκ³ , μΈμλ₯Ό μ λ¬ν μ μμ΅λλ€.
// κ° λ°ν const sum = (function(){ return 10 + 100; }()); console.log(sum); // 110 const sub = (function(a, b){ return a - b; }(10, 100)); console.log(sub); // -90
- μ 리 : μ¦μ μ€ν ν¨μλ μ‘΄μ¬ν μ μλ λ³μμ ν¨μμ μΆ©λμ λ°©μ§νλ κ³³μ μμ£Ό μ¬μ©λ©λλ€.
-
μ¬κ· ν¨μ(Recursive Function) : ν¨μκ° μκΈ° μμ μ νΈμΆνλ κ²μ μ¬κ· νΈμΆ(Recursive Call)μ΄λΌκ³ ν©λλ€.
- μ¬κ· ν¨μλ μμ μ 무νμΌλ‘ νΈμΆνλ―λ‘ λ°λμ νμΆ μ‘°κ±΄μ λͺ
μν΄μΌ ν©λλ€.
function factorial(num){ if(num === 1) return 1; // νμΆ μ‘°κ±΄ return num * factorial(num - 1); // μ¬κ· νΈμΆ } const a = 5; factorial(a); // μ¬κ· ν¨μ νΈμΆ
- μ¬κ· ν¨μλ μμ μ 무νμΌλ‘ νΈμΆνλ―λ‘ λ°λμ νμΆ μ‘°κ±΄μ λͺ
μν΄μΌ ν©λλ€.
-
λ΄λΆ ν¨μ(Inner Function) : μ€μ²© ν¨μ(Nested Funtion)λΌκ³ λ ν©λλ€. μ€μ²© ν¨μλ₯Ό ν¬ν¨νλ ν¨μλ μΈλΆ ν¨μ(Outer Function)λΌκ³ ν©λλ€.
- λ΄λΆ ν¨μλ μΈλΆ ν¨μμ ν¬νΌ ν¨μ(Helper Function)μ μν μ ν©λλ€.
- ν¨μ νΈμ΄μ€ν μ΄ λ°μν μ μμΌλ―λ‘ μ μ΄λ¬Έ λ±μ μ½λ λΈλ‘μμ ν¨μλ₯Ό μ μνμ§λ λ§μΈμ!
- λ΄λΆ ν¨μλ μ€μ½νμ ν΄λ‘μ μ κ΄λ ¨μ΄ μμΌλ―λ‘, μ°¨ν μμΈν λ€λ£Ήλλ€.
// μΈλΆ ν¨μ function outer(){ const a = 1; // λ΄λΆ ν¨μ function inner(){ const b = 2; // μΈλΆ ν¨μμ λ³μ μ°Έμ‘° κ°λ₯ console.log(a + b); } inner(); } outer(); // 3 inner(); // ReferenceError: inner is not defined
-
μ½λ°± ν¨μ(Callback Function) : ν¨μμ λ§€κ°λ³μλ‘ λ΄λΆμ μ λ¬λλ ν¨μλ₯Ό μ½λ°± ν¨μλΌκ³ νλ©°, μ΄λ₯Ό μ λ¬λ°μ ν¨μλ₯Ό κ³ μ°¨ ν¨μ(Higher-Order Function)μ΄λΌκ³ ν©λλ€.
// κ³ μ°¨ ν¨μ logPrint() function logPrint(n, f){ for(let i = 0; i < n; i++){ f(i); // μ½λ°± ν¨μ f() νΈμΆ } }
- ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μμμ λ§€μ° μ€μν μμμ΄λ©°, μΆν λ μμΈν λ€λ£Ήλλ€.
- λ΄λΆ ν¨μκ° μΈλΆ ν¨μλ₯Ό λλ κ²κ³Ό κ°μ΄ μ½λ°± ν¨μλ κ³ μ°¨ ν¨μμ μ λ¬λμ΄ λλ μν μ νλ€. μ½λ°± ν¨μλ ν¨μ μΈλΆμμ μ£Όμ λλ―λ‘ λ΄λΆ ν¨μμ λ¬λ¦¬ μμ λ‘κ² κ΅μ²΄ν μ μμ΅λλ€. μ¦, κ³ μ°¨ ν¨μλ μ½λ°± ν¨μλ₯Ό μμ μ μΌλΆλΆμΈλ§λ₯ ν©μ±ν©λλ€.
- κ³ μ°¨ ν¨μλ λ§€κ°λ³μλ₯Ό ν΅ν΄ μ λ¬λ°μ μ½λ°± ν¨μμ νΈμΆ μμ μ κ²°μ ν΄μ νΈμΆνλλ°, μ΄ λ μ½λ°± ν¨μμ μΈμλ₯Ό μ λ¬ν μ μμ΅λλ€.
- κ³ μ°¨ ν¨μ λ΄λΆμμλ§ νΈμΆλλ κ²½μ°, μ½λ°± ν¨μλ₯Ό μ΅λͺ
ν¨μ 리ν°λ΄λ‘ μ μνλ κ²μ΄ μΌλ°μ μ
λλ€.
logPrint(5, function(i){ console.log(`INFO::: μ½λ°± ν¨μ μ€ν ${i}`); });
- λ€λ₯Έ κ³³μμ μ½λ°± ν¨μλ₯Ό νΈμΆλ κ²½μ° ν¨μ μΈλΆμμ μ½λ°± ν¨μλ₯Ό μ μν΄μΌ ν©λλ€.
const parse = function(i){ if(i % 2) console.log(i); }; logPrint(5, parse);
- λΉλκΈ° νλ‘κ·Έλλ°, λ°°μ΄ κ³ μ°¨ ν¨μμλ μ°μ΄λ μ½λ°± ν¨μλ λ§€μ° μ€μν νλͺ©μ΄λ―λ‘ λ°λμ μ΄ν΄νκ³ λμ΄κ°μλ€!
// μ½λ°± ν¨μλ₯Ό μ¬μ©ν μ΄λ²€νΈ μ²λ¦¬ document.getElementById('printBtn').addEventListner('click', function(){ console.log('λ²νΌμ΄ ν΄λ¦λμμ΅λλ€.'); }); // μ½λ°± ν¨μλ₯Ό μ¬μ©ν λΉλκΈ° μ²λ¦¬ setTimeout(function(){ console.log('1μ΄ κ²½κ³Όνμ΅λλ€.'); }, 1000); // μ½λ°± ν¨μλ₯Ό μ¬μ©ν λ°°μ΄ κ³ μ°¨ ν¨μ // map, filter, reduce λ± λ€μν κ³ μ°¨ ν¨μλ μ°¨ν μμΈν μμλ΄ λλ€! const result1 = [1, 2, 3].map(function(item){ return item * 2; }); console.log(result1); // [2, 4, 5]
