Function 2.

κΉ€μ±„μš΄Β·2021λ…„ 12μ›” 2일
0

WIL

λͺ©λ‘ 보기
2/5

μž¬κ·€ν•¨μˆ˜λž€?

πŸ’ ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 것을 μž¬κ·€ν˜ΈμΆœμ΄λΌ ν•œλ‹€. μž¬κ·€ ν•¨μˆ˜λŠ” 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν–‰μœ„,즉 μž¬κ·€ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.
πŸ’ μž¬κ·€ ν•¨μˆ˜λŠ” λ°˜λ³΅λ˜λŠ” λ™μž‘μ„ μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

// factorial은 1λΆ€ν„° μžμ‹ κΉŒμ§€μ˜ λͺ¨λ“  μ–‘μ˜ μ •μˆ˜μ˜ 곱이닀.
function factorial(n) {
    if (n <= 1) {
        return n // νƒˆμΆœμ‘°κ±΄
    }
    return n * factorial(n - 1) // μž¬κ·€ν˜ΈμΆœ
}
undefined
factorial(0); // 0! = 1
factorial(1); // 1! = 1
factorial(2); // 2! = 2 * 1 = 2
factorial(3); // 3! = 3 * 2 * 1 = 6
factorial(4); // 4! = 4 * 3 * 2 * 1 = 24
factorial(5); // 5! = 5 * 4 * 3 * 2 * 1 = 120

function reverse(text) {
    text += ''
    if(text.length <= 1) {
        return text
    }
    return reverse(text.slice(1)) + text[0]
}

// reverse('hello') == reverse('ello') + 'h' == 'olle' + 'h'
// reverse('ello') == reverse('llo') + 'e' == 'oll' + 'e'
// reverse('llo') == reverse('lo') + 'l' == 'ol' + 'l'
// reverse('lo') == reverse('o') + 'l' == 'o' + 'l'
// reverse('o') == 'o'

// 1, 1, 2, 3, 5, 8, 13, 21 <-- ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄

function fib(n){
    if(n <= 2) {
        return n
    }
    return fib(n-1) + fib(n-2)
}

// μ™Όμͺ½ function만 λ”°λΌκ°”μœΌλ‹ˆ
// fib(4) == fib(3) + fib(2) == 5
// fib(3) == fib(2) + fib(1) == 3
// fib(2) == 2
// fib(1) == 1

// 였λ₯Έμͺ½ 값인 fib(2)λ₯Ό λ‹€μ‹œ ν•΄μ•Όν•˜λŠ” 상황!!
// fib(2) == 2

λ©”λͺ¨μ΄μ œμ΄μ…˜

// ν˜ΈμΆœλ˜λŠ” 것이 λ©”λͺ¨λ¦¬λ₯Ό μ°¨μ§€ν•˜κ³  μžˆμœΌλ―€λ‘œ μ•„λž˜ 기법을 적절히 λ―Ήμ‹±ν•΄μ„œ μ‚¬μš©ν•  ν•„μš”κ°€ 있음
// 반볡문, λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(λ©”λͺ¨μ΄μ œμ΄μ…˜(ν•˜ν–₯식), νƒ€λ·Έλ ˆμ΄μ…˜(상ν–₯식))
let fibo_cache = []
function fibo(n){
  if (n in fibo_cache) {
    return fibo_cache[n]
  }
  fibo_cache[n] = n < 2 ? n : fibo(n-2) + fibo(n-1)
  return fibo_cache[n]
}

// fibo_cache = [0, 1, 1, 2, fibo(2) + fibo(3)]
// fibo(4) == fibo_cache[4] == fibo(2) + fibo(3)
// fibo(2) == fibo_cache[2] == fibo(0) + fibo(1)
// fibo(0) == fibo_cache[0] == 0
// fibo(1) == fibo_cache[1] == 1
// fibo(3) == fibo_cache[3] == fibo(1) + fibo(2)
// fibo(1) == 1
// fibo(2) == 1

μž¬κ·€ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  값을 λ°˜ν™˜ν•˜λ©΄ 결과값이 사라지기 λ•Œλ¬Έμ— νš¨μœ¨μ„±μ— 쒋지 μ•Šλ‹€!
ν•˜μ§€λ§Œ, λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ°˜λ³΅λ˜λŠ” κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•΄μ„œ 같은 κ²°κ³Όλ₯Ό 보닀 λΉ λ₯΄κ²Œ μ‹€ν–‰μ‹œμΌœμ€€λ‹€. ( λ©”λͺ¨λ¦¬μ˜ νš¨μœ¨μ„± ↑)


πŸ‘©β€πŸ« μž¬κ·€ ν•¨μˆ˜λŠ” μžμ‹ μ„ λ¬΄ν•œμœΌλ‘œ μž¬κ·€ ν˜ΈμΆœμ„ ν•  수 μžˆλ‹€. λ”°λΌμ„œ μž¬κ·€ ν•¨μˆ˜μ—μ„œλŠ” νƒˆμΆœ 쑰건을 λ°˜λ“œμ‹œ λ§Œλ“€μ–΄λ†”μ•Ό ν•œλ‹€. μ•ˆ 그럼 λ¬΄μ œν•œ 호좜둜 μ—λŸ¬κ°€ λ°œμƒν•¨.
πŸ‘©β€πŸ« μž¬κ·€ν•¨μˆ˜λ‘œ λ§Œλ“€ 수 μžˆλŠ” 것듀은 μ›¬λ§Œν•˜λ©΄ for, while처럼 λ°˜λ³΅λ¬ΈμœΌλ‘œλ„ λ§Œλ“€μ–΄ 쀄 수 μžˆλ‹€. λ‹€λ§Œ μž¬κ·€ν•¨μˆ˜λŠ” λ¬΄ν•œ λ°˜λ³΅μ— 빠질 μœ„ν—˜μ΄ μžˆμœΌλ‹ˆ, μž¬κ·€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 편이 더 μ§κ΄€μ μœΌλ‘œ 이해할 수 μžˆμ„ μƒν™©μ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.(호좜 횟수만큼 λ©”λͺ¨λ¦¬ μ†ŒλΉ„λŸ‰μ΄ 늘기 λ•Œλ¬Έμ— λ°˜λ³΅λ¬Έμ„ μ“°λŠ”κ²Œ λ©”λͺ¨λ¦¬ 곡간을 더 적게 μ°¨μ§€ν•œλ‹€.)

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

μ •μ˜λ˜μžλ§ˆμž μ¦‰μ‹œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜. 이 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 단 ν•œ 번만 호좜되며 λ‹€μ‹œ 호좜이 λΆˆκ°€ν•˜λ‹€.

// 읡λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function () {
  let a = 1;
  let b = 2;
  return a + b;
}());

// κΈ°λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
(function foo() {
  let a = 3;
  let b = 5;
  return a * b;
}());

foo(); // ReferenceError: foo is not defined
// μ–΄μ°¨ν”Ό μ‹€ν–‰ν•˜μ§€ λͺ»ν•΄μ„œ μ˜λ―Έκ°€μ—†μŒ.
// λ©”λͺ¨λ¦¬ 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ λ°”λ‘œ μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” 것듀을 μ¦‰μ‹œ μ‹€ν–‰ν•¨μˆ˜λ‘œ 관리

```예제1
let data = [{
                반 : 1, 
                번 : 1, 
                이름 : "ν˜Έμ€€", 
                μ€‘κ°„κ³ μ‚¬μ μˆ˜ : 55
            }, {
                반 : 1, 
                번 : 2, 
                이름 : "길동", 
                μ€‘κ°„κ³ μ‚¬μ μˆ˜ : 60
            }, {
                반 : 1, 
                번 : 3, 
                이름 : "영희", 
                μ€‘κ°„κ³ μ‚¬μ μˆ˜ : 30
            }, {
                반 : 1, 
                번 : 4, 
                이름 : "철수", 
                μ€‘κ°„κ³ μ‚¬μ μˆ˜ : 20
            }, {
                반 : 1, 
                번 : 5, 
                이름 : "규리", 
                μ€‘κ°„κ³ μ‚¬μ μˆ˜ : 100
            }]

console.log(data.map(x => x.μ€‘κ°„κ³ μ‚¬μ μˆ˜))
console.log(data.map(x => [x.이름,x.μ€‘κ°„κ³ μ‚¬μ μˆ˜]))

let data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
let newData = data.map(a => a.map(n => n * 2));

let νšŒμ›μ •λ³΄ = [{
    아이디: 'jjang',
    νŒ¨μŠ€μ›Œλ“œ: '5dbfbded05f34de754e8f265448be17934580556b488c0461fd12d211a87aaa5',
    성별: '남',
    νœ΄λŒ€ν°λ²ˆν˜Έ: '010-5004-0000',
    이메일: 'hojun1@gmail.com',
    κ°€μž…μ—°λ„: '2020-12-02',
    μ£Όμ ‘μ†μœ„μΉ˜: '125.242.161.149'
}, {
    아이디: 'jjang2',
    νŒ¨μŠ€μ›Œλ“œ: '5dbfbded05f34de754e8f265448be17934580556b488c0461fd12d211a87aaa5',
    성별: '남',
    νœ΄λŒ€ν°λ²ˆν˜Έ: '010-5004-0000',
    이메일: 'hojun2@gmail.com',
    κ°€μž…μ—°λ„: '2021-12-02',
    μ£Όμ ‘μ†μœ„μΉ˜: '125.242.161.149'
}, {
    아이디: 'jjang3',
    νŒ¨μŠ€μ›Œλ“œ: '5dbfbded05f34de754e8f265448be17934580556b488c0461fd12d211a87aaa5',
    성별: 'μ—¬',
    νœ΄λŒ€ν°λ²ˆν˜Έ: '010-5004-0000',
    이메일: 'hojun3@gmail.com',
    κ°€μž…μ—°λ„: '2021-12-02',
    μ£Όμ ‘μ†μœ„μΉ˜: '125.242.161.149'
}, {
    아이디: 'jjang4',
    νŒ¨μŠ€μ›Œλ“œ: '5dbfbded05f34de754e8f265448be17934580556b488c0461fd12d211a87aaa5',
    성별: 'μ—¬',
    νœ΄λŒ€ν°λ²ˆν˜Έ: '010-5004-0000',
    이메일: 'hojun4@gmail.com',
    κ°€μž…μ—°λ„: '2020-12-02',
    μ£Όμ ‘μ†μœ„μΉ˜: '125.242.161.149'
}];


// 1번 λ‚¨μžμΈ μ‚¬λžŒ
νšŒμ›μ •λ³΄.filter(el => el.성별 === '남');

// 2번 λ‚¨μžμ΄λ©΄μ„œ 2021년도에 κ°€μž…ν•˜μ‹  λΆ„
// 2.1
νšŒμ›μ •λ³΄.filter(el => el.성별 === '남' && el.κ°€μž…μ—°λ„.split('-')[0] === '2021');

// 2.2
νšŒμ›μ •λ³΄.filter(el => el.성별 === '남' && el.κ°€μž…μ—°λ„.slice(0, 4) === '2021');

// 3번 아이디가 jjang인 μ‚¬λžŒμ„ μ°Ύμ•„μ£Όμ„Έμš”.
νšŒμ›μ •λ³΄.find(user => user.아이디 === 'jjang');

  • μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λŠ” 자체 scopeλ₯Ό ν˜•μ„±ν•˜κΈ° λ•Œλ¬Έμ— μ™ΈλΆ€λ‘œ 접근은 κ°€λŠ₯ν•˜μ§€λ§Œ μ™ΈλΆ€μ—μ„œ λ‚΄λΆ€λ‘œλŠ” 접근이 λΆˆκ°€ν•˜λ‹€. κ·Έλž˜μ„œ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ μ‚¬μš©μ˜ 큰 λͺ©μ μ€ 데이터 ν”„λΌμ΄λ²„μ‹œμ™€ μ½”λ“œμ˜ λͺ¨λ“ˆν™”라고 ν•  수 μžˆλ‹€.
  • function(){} μ΄λ ‡κ²Œ 되면 μ½”λ“œλ₯Ό ν•΄μ„ν•˜λŠ” parseλŠ” 이것을 ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μΈμ§€ν•œλ‹€.
    선언문은 κ°’μœΌλ‘œ 남지 μ•ŠκΈ° λ•Œλ¬Έμ— () κ΄„ν˜Έλ‘œ λ¬Άμ–΄μ£Όμ–΄ 이것이 ν•¨μˆ˜ν‘œν˜„μ‹μ΄λΌλŠ” 것을 λͺ…μ‹œμ μœΌλ‘œ λ‚˜νƒ€λ‚΄μ€˜μ•Ό ν•œλ‹€.

call by value, reference, sharing

  • call by value와 call by referenceλŠ” λ³€μˆ˜λ‚˜ 객체등이 ν•¨μˆ˜μ˜ 인자둜 듀어와 λ§€κ°œλ³€μˆ˜λ‘œ 전달될 λ•Œ μ–΄λ–€ λ°©μ‹μœΌλ‘œ 전달될 지λ₯Ό κ²°μ •ν•˜λŠ” 방식이닀.
    λ™μž‘ 방식은 κ°’μ—μ˜ν•œ 전달, 참쑰에 μ˜ν•œ 전달과 λ™μΌν•˜λ‹€.

Call by value

κ°’μ˜ λ³΅μ‚¬λŠ” 말 κ·Έλž˜λ„ λ³΅μ‚¬λœ 값을 인자둜 λ„˜κ²¨μ„œ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” 방식이닀.
κΈ°λ³Έν˜•(Primitive type)의 경우 call by value λ°©μ‹μœΌλ‘œ 전달됨.

let array = [100, 200, 300];

function test(a) {
    a[0] = 1000;
}

test(array)
array
 [1000, 200, 300]

Call by reference

μ£Όμ†Œκ°’μ˜ λ³΅μ‚¬λŠ” μ‹€μ œ 데이터가 μ‘΄μž¬ν•˜λŠ” μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œκ°’μ„ 인자둜 λ„˜κ²¨μ„œ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” 방식이닀. 객체(Object, Array, Function)은 call by reference λ°©μ‹μœΌλ‘œ μ „λ‹¬λœλ‹€.

let v = 100;

function test(a) {
    a = 1000;
}

test(v)
v
100

❗❗ JSλŠ” Call by value만 μ‘΄μž¬ν•œλ‹€

let v = 100;

function test(a) {
    a = 1000;
}

test(v)
v
100
  • 이 μ½”λ“œλ‘œ μ„€λͺ…을 ν•΄λ³΄μžλ©΄, λ‹€λ₯Έμ–Έμ–΄μ—μ„œμ˜ κ²½μš°μ—μ„œλŠ” v의 값이 1000으둜 λ°”λ€Œμ—ˆμ„ 것이닀. μ™œλƒ μ™„μ „ν•œ μ£Όμ†Œκ°’ 참쑰둜 μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ΄λ‹€.
  • ν•˜μ§€λ§Œ JSλŠ” 객체의 ν”„λ‘œνΌν‹° 값이 μ•„λ‹Œ 객체 자체의 변경을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€. μ£Όμ†Œκ°’μ„ μ°Έμ‘°ν•˜λŠ” 게 μ•„λ‹ˆλΌ μ£Όμ†Œκ°’μ„ 볡사해 λ„˜κΈ°κΈ° λ•Œλ¬Έμ΄λ‹€.
  • 결둠적으둜 두 κ°μ²΄λŠ” μ£Όμ†Œμ˜ 이름은 같을 수 μžˆμ§€λ§Œ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ— μ €μž₯된 객체이닀.

Call by sharing

  • μœ„μ˜ Call by value와 Call by reference의 νŠΉμ§•μ΄ μ§¬λ½•λœ κ²ƒμœΌλ‘œ, Call by valueμ΄λ©΄μ„œ Call by reference 일 λ•Œ Call by sharing이라고 ν•œλ‹€.

πŸ‘‡ μ•„λž˜μ™€ 같은 νŠΉμ§• λ•Œλ¬Έμ— jsμ—μ„œλŠ” call by sharing이라 μ–˜κΈ°ν•œλ‹€.

var a = {};
function test(b) {
    b = 1000;
}

test(a)
a
{}

πŸ˜‚ argument둜 μ „λ‹¬λ˜λŠ” λ³€μˆ˜κ°€ μ›μ‹œκ°’μΌ 경우 call by value처럼 ν‰κ°€λ˜κ³ , 아닐 κ²½μš°λŠ” parameter에 μ°Έμ‘°(λ©”λͺ¨λ¦¬ μ£Όμ†Œ)만 μ „λ‹¬λœλ‹€.

0개의 λŒ“κΈ€