πŸ’β€β™€οΈ ν•¨μˆ˜(Function)λž€,
객체 νƒ€μž…μ˜ κ°’μœΌλ‘œ λ‹€λ₯Έ 객체처럼 속성 및 methodλ₯Ό κ°€μ§ˆ 수 μžˆκΈ°μ— 일급(first-class) 객체이며 인자λ₯Ό κ°€μ§ˆ 수 μžˆλŠ” μ½”λ“œ 블둝


πŸ™‹β€ ν•¨μˆ˜μ˜ νŠΉμ§•

  • ν•¨μˆ˜λŠ” κ°’μ΄λ―€λ‘œ,
    • λ³€μˆ˜μ•ˆμ— λ‹΄κΈΈ 수 있음 (ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ή κ°€λŠ₯)
    • 객체의 μ†μ„±μ•ˆμ— method둜 λ‹΄κΈΈ 수 있음
    • λ‹€λ₯Έ ν•¨μˆ˜μ˜ μΈμžκ°’μœΌλ‘œ 전달될 수 있음
    • λ‹€λ₯Έ ν•¨μˆ˜μ˜ returnκ°’μœΌλ‘œλ„ μ‚¬μš© κ°€λŠ₯
    • λ°°μ—΄μ˜ κ°’μœΌλ‘œλ„ μ‚¬μš© κ°€λŠ₯

πŸ‘€ ν•¨μˆ˜(function)

1) ν•¨μˆ˜ μ„ μ–Έλ¬Έ

ν•¨μˆ˜ μ„ μ–Έλ¬Έμ—μ„œλŠ” ν•¨μˆ˜μ˜ 이름 μƒλž΅ λΆˆκ°€

function hello(name) {
    return `${name}λ‹˜ μ•ˆλ…•ν•˜μ„Έμš”`;
}

// ν•¨μˆ˜ 호좜
console.log(hello('νš¨μ—°'));

2) ν•¨μˆ˜ ν‘œν˜„μ‹

ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œλŠ” ν•¨μˆ˜λͺ… μƒλž΅ κ°€λŠ₯

[1] ν•¨μˆ˜λͺ… μƒλž΅

// λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄μ„œ ν•¨μˆ˜ 생성
var hello = function (name) {
    return `${name}λ‹˜ μ•ˆλ…•ν•˜μ„Έλ©`;
}

console.log(hello('치즈'));

[2] ν•¨μˆ˜λͺ… λͺ…μ‹œ

ν•¨μˆ˜ ν‘œν˜„μ‹μ—μ„œ ν•¨μˆ˜λͺ…을 λͺ…μ‹œν•΄λ„ 문제 X

var calc = function add(a, b) {
    return a + b;
}
β—Ό 단, ν•¨μˆ˜ ν˜ΈμΆœμ€ μ‹λ³„μžλ‘œ 이루어지며 ν•¨μˆ˜λͺ…μœΌλ‘œλŠ” 호좜 X

μ–΄μ§œν”Ό calc λ³€μˆ˜λ‘œ ν˜ΈμΆœν•˜λ‹ˆ, ν•¨μˆ˜λͺ…(add)을 μƒλž΅ν•˜λŠ” 것

console.log(calc(10, 20));
// console.log(add(10, 20)); // ReferenceError: add is not defined

3) ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… (function hoisting) πŸ”₯μ€‘μš”πŸ”₯

πŸ’β€β™€οΈ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… (function hoisting)μ΄λž€,
ν•¨μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄μ˜¬λ €μ§„ 것 처럼 λ™μž‘ν•˜λŠ” 것

console.log(hello('νš¨μ—°'));
// console.log(hi('치즈')); // TypeError: hi is not a function
// hiκ°€ ν•¨μˆ˜μž„μ΄ ν‰κ°€λ˜κΈ° 이전에 ν˜ΈμΆœν•˜λ©΄ TypeError


// ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function hello(name) {
    return `${name}λ‹˜ μ–΄μ„œμ˜€μ‹­μ‡Ό. κ·Ήμ§„νžˆ λͺ¨μ‹œκ² μλ‹ˆλ‹€`;
}

// ν•¨μˆ˜ ν‘œν˜„μ‹
var hi = function(name) {
    return `${name} μ•ˆλ‡½?`;
}
console.log(hi('치즈')); // 식은 ν•¨μˆ˜ ν‘œν˜„μ‹ 이후에 좜λ ₯해야함 (ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… 효과 X)

πŸ“Œ Ref.

* ν•¨μˆ˜ 선언문은 λŸ°νƒ€μž„ 이전 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ λ¨Όμ € μ‹€ν–‰.
  λ”°λΌμ„œ ν•¨μˆ˜ μ„ μ–Έλ¬Έ 이전에 'ν•¨μˆ˜λ₯Ό μ°Έμ‘° 및 호좜 κ°€λŠ₯'
* λ³€μˆ˜ ν• λ‹Ήλ¬Έμ˜ 값은 할당문이 μ‹€ν–‰λ˜λŠ” μ‹œμ , 즉 λŸ°νƒ€μž„μ— ν‰κ°€λ˜λ―€λ‘œ ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ λ¦¬ν„°λŸ΄λ„ 
  할당문이 μ‹€ν–‰λ˜λŠ” μ‹œμ μ— ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체가 됨
  ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ ν•¨μˆ˜ ν‘œν˜„μ‹ 이후에 μ°Έμ‘°ν•˜κ³  ν˜ΈμΆœν•΄μ•Όν•¨

πŸ‘€ ν•¨μˆ˜μ˜ 호좜

1) λ§€κ°œλ³€μˆ˜μ™€ 인수

[1] λͺ¨λ“  μΈμˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ arguments 객체의 ν”„λ‘œνΌν‹°λ‘œ 보관

function hello(name) {

    console.log(arguments); // 전달받은 λͺ¨λ“  인자 좜λ ₯

    return `${name}λ‹˜ 방가방가햄토리`;
}
// λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜ λ°”λ”” μ™ΈλΆ€μ—μ„œ μ°Έμ‘° X
// console.log(name);

var result = hello('νš¨μ—°');
console.log(result);

[2] ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜λŠ”μ§€ 체크 X

/* μΈμˆ˜κ°€ λΆ€μ‘±ν•΄μ„œ ν• λ‹Ήλ˜μ§€ μ•Šμ€ λ§€κ°œλ³€μˆ˜μ˜ 값은 undefined */
result = hello();
console.log(result); // undefinedλ‹˜ 방가방가햄토리 좜λ ₯

/* λ§€κ°œλ³€μˆ˜λ³΄λ‹€ μΈμˆ˜κ°€ 더 λ§Žμ€ 경우, 초과된 μΈμˆ˜λŠ” λ¬΄μ‹œ */
result = hello('치즈', '수민');
console.log(result); // μΉ˜μ¦ˆλ‹˜ 방가방가햄토리 좜λ ₯

[3] 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šκ±°λ‚˜ undefinedλ₯Ό μ „λ‹¬ν•˜λ©΄ λ§€κ°œλ³€μˆ˜ κΈ°λ³Έ 값이 λ™μž‘

function hi(name = 'μ•„λ¬΄κ°œ') { // 'μ•„λ¬΄κ°œ'둜 κΈ°λ³Έκ°’ μ„€μ •
    return `Hey~ ${name}`;
}

result = hi('치즈');
console.log(result);    // Hey~ 치즈
result = hi();
console.log(result);    // Hey~ μ•„λ¬΄κ°œ => 인자λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ κΈ°λ³Έκ°’ 좜λ ₯

2) λ°˜ν™˜λ¬Έ

[1] λ°˜ν™˜ νƒ€μž…μ΄ μžˆλŠ” ν•¨μˆ˜

function hello(name) {

    return `${name}λ‹˜ μ•ˆλ…•ν•˜μ‹¬κΉŒ!`;
    // λ°˜ν™˜λ¬Έ μ΄ν›„μ˜ 문은 μ‹€ν–‰λ˜μ§€ μ•Šκ³  λ¬΄μ‹œ (Unreachable code)
    // console.log(name);
}

console.log(hello('치즈'));

[2] λ°˜ν™˜ νƒ€μž…μ΄ μ—†λŠ” ν•¨μˆ˜

function func() {
    console.log('ν•¨μˆ˜κ°€ 호좜 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
    // return; // λ°˜ν™˜ 값을 λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ undefined λ°˜ν™˜
    // λ°˜ν™˜ 값이 없을 μ‹œ λ°˜ν™˜λ¬Έ μƒλž΅ κ°€λŠ₯ν•˜λ©° 이 λ•Œλ„ μ•”λ¬΅μ μœΌλ‘œ undefined λ°˜ν™˜
}

console.log(func()); // λ°˜ν™˜κ°’μ΄ μ—†μœΌλ―€λ‘œ undefined 좜λ ₯

πŸ‘€ ν™”μ‚΄ν‘œ ν•¨μˆ˜(arrow function) πŸ”₯μ€‘μš”πŸ”₯

πŸ’β€β™€οΈ ν™”μ‚΄ν‘œ ν•¨μˆ˜(arrow function)λž€,
function ν‚€μ›Œλ“œ λŒ€μ‹  ν™”μ‚΄ν‘œλ₯Ό μ‚¬μš©ν•΄ 보닀 κ°„λž΅ν•˜κ²Œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 항상 읡λͺ…ν•¨μˆ˜λ‘œ μ •μ˜ν•˜λ©° 본문이 ν•œ 쀄인 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ 유용

1) ν™”μ‚΄ν‘œ ν•¨μˆ˜ κΈ°λ³Έ 문법

[1] κΈ°μ‘΄ function μ •μ˜

message = function() {
    return 'Hello Cheese!';
};
console.log(message());

[2] function ν‚€μ›Œλ“œ μƒλž΅

message = () => {
    return 'Arrow Function!';
};
console.log(message());

[3] λͺ…령문이 ν•˜λ‚˜λ§Œ μžˆμ„ 경우 μ€‘κ΄„ν˜Έ μƒλž΅ κ°€λŠ₯

message = () => 'Arrow Functions are so simple!';
console.log(message());

[4] λ§€κ°œλ³€μˆ˜κ°€ μžˆμ„ 경우

message = (val1, val2) => 'We' + val1 + val2;
console.log(message(" are parameters", '!!'));

[5] λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μ΄λ©΄ μ†Œκ΄„ν˜Έλ₯Ό μƒλž΅

λ§€κ°œλ³€μˆ˜κ°€ μ—†κ±°λ‚˜ μ—¬λŸ¬ 개일 경우 μƒλž΅ λΆˆκ°€

message = val1 => 'Just' + val1;
console.log(message(' a parameter'));

πŸ‘€ μ—¬λŸ¬ μ’…λ₯˜μ˜ ν•¨μˆ˜

1) μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

πŸ’β€β™€οΈ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λž€,
ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ 호좜이 λ˜λŠ” ν•¨μˆ˜λ‘œ 단 ν•œλ²ˆλ§Œ 호좜되며 재호좜 λΆˆκ°€

  • μ¦‰μ‹œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ κ·Έλ£Ή μ—°μ‚°μž()둜 감싸야함
  • μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ 내에 μ½”λ“œλ₯Ό λͺ¨μ•„두면 ν˜Ήμ‹œ λ‹€λ₯Έ μ˜μ—­μ— μžˆμ„μˆ˜λ„ μžˆλŠ” λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ˜ 이름 μΆ©λŒμ„ 사전에 λ°©μ§€ κ°€λŠ₯(μ˜μ—­λΆ„λ¦¬)
// ν•¨μˆ˜ 이름이 μ—†λŠ” 읡λͺ…(Anonymous) ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 일반적
(function() {
    console.log('읡λͺ… μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜! ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— 호좜')

})(); // (); : μ¦‰μ‹œ μ‹€ν–‰(호좜)

(function hello(name) { // 재호좜이 λΆˆκ°€ν•˜λ―€λ‘œ ν•¨μˆ˜λͺ…(hello)은 μ˜λ―Έκ°€ μ—†μŒ
    console.log('κΈ°λͺ… μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜! ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— 호좜!')
    console.log(`${name}λ‹˜ Hi!`)
    
})('치즈'); // λ§€κ°œλ³€μˆ˜λΆ€κ°€ μžˆμ„ μ‹œ, 인자λ₯Ό 이 μ†Œκ΄„ν˜Έμ— 전달

// hello('νš¨μ—°'); 
// ReferenceError: hello is not defined => μ •μ˜ λ˜μ–΄μžˆμ§€ μ•Šμ•„ 재호좜 λΆˆκ°€

2) μž¬κ·€ ν•¨μˆ˜

πŸ’β€ ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ 호좜이라고 ν•˜λ©°, 이 μž¬κ·€ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜μΈ μž¬κ·€ ν•¨μˆ˜λŠ” λ°˜λ³΅λ˜λŠ” 처리λ₯Ό μœ„ν•΄ μ‚¬μš©

[1] factorial(!)ν•¨μˆ˜ 생성

// n! = 1 * 2 * ... * (n-1) * n;
function factorial(n) {
    // n이 1 μ΄ν•˜μΌ λ•Œ 1을 λ°˜ν™˜ν•˜λ©΄μ„œ μž¬κ·€ν˜ΈμΆœ stop
    if(n <= 1) return 1;
    
    // μž¬κ·€ 호좜
    return n * factorial(n - 1);
}

console.log(factorial(1)); // 1 (1)
console.log(factorial(2)); // 2 (2 * 1)
console.log(factorial(3)); // 6 (3 * 2 * 1)
console.log(factorial(4)); // 24 (4 * 3 * 2 * 1)
console.log(factorial(5)); // 120 (5 * 4 * 3 * 2 * 1)

3) 쀑첩 ν•¨μˆ˜

πŸ’β€ ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜λ₯Ό 쀑첩 ν•¨μˆ˜ λ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜λΌκ³  ν•˜λ©°, 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜.

  • 일반적으둜 쀑첩 ν•¨μˆ˜λŠ” μžμ‹ μ„ ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό λ•λŠ” 헬퍼 ν•¨μˆ˜μ˜ μ—­ν• 
function outer() {
    var outerVal = 'μ™ΈλΆ€ ν•¨μˆ˜';

    function inner() { // λ‚΄λΆ€ ν•¨μˆ˜ : μ™ΈλΆ€ ν•¨μˆ˜μ˜ helper μ—­ν• 
        var innerVal = 'λ‚΄λΆ€ ν•¨μˆ˜';
        console.log(outerVal + "," + innerVal); 
        // μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό λ‚΄λΆ€ ν•¨μˆ˜μ—μ„œ μ°Έμ‘° κ°€λŠ₯
    }

    inner(); 
    // outerν•¨μˆ˜ μ•ˆμ—μ„œ innerν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ•Ό μ•„λž˜μ˜ outerν•¨μˆ˜ 호좜이 정상 μž‘λ™
}

outer();

4) 콜백 ν•¨μˆ˜ & κ³ μ°¨ ν•¨μˆ˜

πŸ’β€β™€οΈ 콜백 ν•¨μˆ˜ & κ³ μ°¨ ν•¨μˆ˜λž€,

  • 콜백 ν•¨μˆ˜ : ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜ (κ³ μ°¨ ν•¨μˆ˜μ— μ „λ‹¬λ˜μ–΄ 헬퍼 ν•¨μˆ˜μ˜ μ—­ν• )
  • κ³ μ°¨ ν•¨μˆ˜ : λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ 콜백 ν•¨μˆ˜λ₯Ό 전달 받은 ν•¨μˆ˜

[1] 콜백 ν•¨μˆ˜ & κ³ μ°¨ ν•¨μˆ˜μ˜ ν™œμš©

// 전달 λ°›λŠ” 값을 증가 μ‹œμΌœμ£ΌλŠ” ν•¨μˆ˜ (콜백 ν•¨μˆ˜)
function increase(value) {
    return value + 1;
}

// 전달 받은 값을 κ°μ†Œ μ‹œμΌœμ£ΌλŠ” ν•¨μˆ˜ (콜백 ν•¨μˆ˜)
function decrease(value) {
    return value - 1;
}

// 전달 받은 ν•¨μˆ˜μ— 전달 받은 값을 적용 μ‹œμΌœμ£ΌλŠ” κ³ μ°¨ ν•¨μˆ˜
function apply(func, value) { // (μ„ νƒν•œ ν•¨μˆ˜λͺ…, κ°’)
    // κ³ μ°¨ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 전달 받은 콜백 ν•¨μˆ˜μ˜ 호좜 μ‹œμ μ„ κ²°μ •ν•΄μ„œ 호좜
    // 콜백 ν•¨μˆ˜λŠ” κ³ μ°¨ ν•¨μˆ˜μ— μ˜ν•΄ 호좜 되며 이 λ•Œ κ³ μ°¨ ν•¨μˆ˜λŠ” ν•„μš”μ— 따라 콜백 ν•¨μˆ˜μ— 인수 전달 κ°€λŠ₯
    return func(value);
}

// κ³ μ°¨ ν•¨μˆ˜λ‘œ 콜백 ν•¨μˆ˜λ₯Ό μ „λ‹¬ν•˜λ©° 호좜
console.log(apply(increase, 5));
console.log(apply(decrease, 5));

[2] 콜백 ν•¨μˆ˜κ°€ κ³ μ°¨ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ 호좜 될 경우

콜백 ν•¨μˆ˜λ₯Ό 읡λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μ •μ˜ν•˜λ©΄μ„œ λ°”λ‘œ κ³ μ°¨ ν•¨μˆ˜μ— μ „λ‹¬ν•˜λŠ” 것이 일반적

console.log(apply(function(value){ return value + 1; }, 10)); // ꡳ이 increase ν•¨μˆ˜λ₯Ό λ§Œλ“€ ν•„μš” X

// Arrow function도 ν™œμš© κ°€λŠ₯
console.log(apply(value => value - 1, 10));

πŸ“Œ Ref.

*  ν•¨μˆ˜μ˜ λ³€ν•˜μ§€ μ•ŠλŠ” 곡톡 λ‘œμ§μ€ 미리 μ •μ˜ν•΄λ‘κ³  κ²½μš°μ— 따라 λ³€κ²½λ˜λŠ” λ‘œμ§μ€ μΆ”μƒν™”ν•΄μ„œ 
ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€λ‘œ μ „λ‹¬ν•˜λŠ” 방식. 콜백 ν•¨μˆ˜λŠ” 비동기 처리(이벀트, 타이머, ajax)μ—μ„œ 
ν™œμš©λ˜λŠ” μ€‘μš”ν•œ νŒ¨ν„΄μ΄λ©° λ°°μ—΄ κ³ μ°¨ ν•¨μˆ˜μ—μ„œλ„ μ‚¬μš©
* ex) 
console.log([3, 1, 4, 2, 5].sort((left, right) => right - left)); 
// (left, right) => right - leftλ₯Ό sort(κ³ μ°¨ ν•¨μˆ˜)에 μ „λ‹¬ν•˜μ—¬ κΈ°μ€€ μ„€μ •

5) 순수 ν•¨μˆ˜ & λΉ„μˆœμˆ˜ ν•¨μˆ˜

πŸ’β€β™€οΈ 순수 ν•¨μˆ˜ & λΉ„μˆœμˆ˜ ν•¨μˆ˜ λž€,

  • 순수 ν•¨μˆ˜ : μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€λ„ μ•Šκ³  λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ” ν•¨μˆ˜
  • λΉ„μˆœμˆ˜ ν•¨μˆ˜ : μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” ν•¨μˆ˜
  • πŸ‘‰ ν•¨μˆ˜ μ™ΈλΆ€ μƒνƒœμ˜ 변경을 μ§€μ–‘ν•˜λŠ” '순수 ν•¨μˆ˜'λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŒ
var cnt = 0;

// 순수 ν•¨μˆ˜λŠ” μ΅œμ†Œ ν•˜λ‚˜ μ΄μƒμ˜ 인수λ₯Ό 전달 λ°›μœΌλ©° 인수의 λΆˆλ³€μ„±μ„ μœ μ§€
function increase(n) {
    return ++n;
}

// 순수 ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ κ²°κ³Ό 값을 λ³€μˆ˜μ— μž¬ν• λ‹Ή ν•΄μ„œ μƒνƒœλ₯Ό λ³€κ²½
cnt = increase(cnt);
console.log(cnt); // 1

// λΉ„μˆœμˆ˜ ν•¨μˆ˜λŠ” μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜λ©° μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½
function decrease() {
    return --cnt;
}

// λΉ„μˆœμˆ˜ ν•¨μˆ˜λŠ” μ™ΈλΆ€ μƒνƒœ(cnt)λ₯Ό λ³€κ²½ν•˜λ―€λ‘œ μƒνƒœ λ³€ν™”λ₯Ό μΆ”μ ν•˜κΈ° 어렀움
decrease(); // 호좜
console.log(cnt); // 0

πŸ‘€ 일급 객체 πŸ”₯μ€‘μš”πŸ”₯

πŸ’β€β™€οΈ 일급 객체의 쑰건
[1] 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성 κ°€λŠ₯ (즉, λŸ°νƒ€μž„μ— 생성 κ°€λŠ₯)
[2] λ³€μˆ˜λ‚˜ 자료ꡬ쑰(객체, λ°°μ—΄ λ“±)에 μ €μž₯ κ°€λŠ₯
[3] ν•¨μˆ˜λ‚˜ λ§€κ°œλ³€μˆ˜μ— 전달 κ°€λŠ₯
[4] ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš© κ°€λŠ₯

  • ν•¨μˆ˜κ°€ 일급 κ°μ²΄λΌλŠ” 것은 ν•¨μˆ˜λ₯Ό 객체와 λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 의미
  • κ°μ²΄λŠ” "κ°’"μ΄λ―€λ‘œ ν•¨μˆ˜λŠ” κ°’κ³Ό λ™μΌν•˜κ²Œ μ·¨κΈ‰
  • λ³€μˆ˜ ν• λ‹Ήλ¬Έ, 객체의 ν”„λ‘œνΌν‹° κ°’, λ°°μ—΄μ˜ μš”μ†Œ, ν•¨μˆ˜ 호좜의 인수, ν•¨μˆ˜ λ°˜ν™˜λ¬Έ λ“±μ—μ„œ μ‚¬μš© κ°€λŠ₯
// [1] 무λͺ…μ˜ λ¦¬ν„°λŸ΄λ‘œ 생성 κ°€λŠ₯
// [2] λ³€μˆ˜μ— μ €μž₯ κ°€λŠ₯
var hello = function() { // function() { return 'Hi there!';} : ν•¨μˆ˜μ˜ λ¦¬ν„°λŸ΄(무λͺ…)
    return 'Hi there!';
};

// [2] 객체에 μ €μž₯ κ°€λŠ₯
var obj = { hello }; // var obj = { 'hello' : hello }; : μ›λž˜ ν˜•νƒœ

// [3] ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ— 전달 κ°€λŠ₯
function repeat(func, count) {
    for(var i = 0; i < count; i++) {
        console.log(func());
    }
    // [4] ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš© κ°€λŠ₯
    return function() { // repeat 호좜 μ‹œ, 이 ν•¨μˆ˜ 리턴
        console.log(`${count}번 반볡 μ™„λ£Œ`);
    }
}
var returnFunc = repeat(obj.hello, 5); // repeat(obj.hello, 5) : Hi there! λ‹€μ„― 번 좜λ ₯
returnFunc(); // '5번 반볡 μ™„λ£Œ' 좜λ ₯

>>> repeat을 ν˜ΈμΆœν•˜κ³  리턴 받은 것이 λ‹΄κΈ΄ returnFuncλ³€μˆ˜λ₯Ό ν•¨μˆ˜ ν˜ΈμΆœν•˜λ“―μ΄ 호좜(ν•¨μˆ˜λ₯Ό 담은 λ³€μˆ˜μ΄λ―€λ‘œ)

profile
Tiny little habits make me

0개의 λŒ“κΈ€