[JavaScript] ν•¨μˆ˜

mangsuyoΒ·2023λ…„ 7μ›” 22일

ν•¨μˆ˜

πŸ’‘ ν•¨μˆ˜λž€?

ν•¨μˆ˜ : νŠΉμ •ν•œ 일을 μˆ˜ν–‰ν•˜λŠ” μ½”λ“œμ˜ μ§‘ν•©

μž¬μ‚¬μš© κ°€λŠ₯, 높은 가독성, μœ μ§€ λ³΄μˆ˜μ„±

μ€‘λ³΅λ˜λŠ” 일이 μžˆλ‹€λ©΄, ν•¨μˆ˜ λ‹¨μœ„λ‘œ 잘 λ¬ΆλŠ” 것이 μ€‘μš”ν•˜λ‹€

ν•¨μˆ˜κ°€ ν•˜λŠ” 일 잘 λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 이름을 μ§€μ–΄μ•Όν•œλ‹€.

λ§€κ°œλ³€μˆ˜ 이름도 의미있게 μ§€μ–΄μ•Ό ν•œλ‹€.

πŸ’‘ ν•¨μˆ˜μ˜ κΈ°λ³Έ

ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ©΄, μ„ μ–Έλœ ν•¨μˆ˜λŠ” μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

μ‚¬μš©μ˜ˆμ œ 1
function add(a, b){
  return a + b;
}
const result = add(5, 3);

μ‚¬μš©μ˜ˆμ œ 2
function fullName(firstName, lastName){
  return `${firstName} ${lastName}`;
}

const userName = fullName('λͺ…μˆ˜', 'ν•œ');

πŸ’‘ ν•¨μˆ˜μ™€ λ©”λͺ¨λ¦¬

ν•¨μˆ˜λ„ 객체 νƒ€μž…μ΄λ―€λ‘œ, ν•¨μˆ˜μ˜ μ½”λ“œλΈ”λŸ­μ€ λ©”λͺ¨λ¦¬ Heap뢀뢄에 μ €μž₯λœλ‹€.

ν•¨μˆ˜μ΄λ¦„μ€ ν•¨μˆ˜μ˜ μ½”λ“œλΈ”λŸ­μ΄ μžˆλŠ” 곳의 μ£Όμ†Œλ₯Ό λ‹΄κ³ μžˆλ‹€.

function add(a, b){
  return a + b;
}

const sum = add; -> sum은 add의 μ½”λ“œλΈ”λŸ­μ„ κ°€λ₯΄ν‚€κ²Œ λœλ‹€.

sum(1, 2) === add(1, 2) -> μ™„μ „νžˆ λ™μΌν•˜λ‹€.

μΆ”κ°€λ‘œ, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” 항상 μ†Œκ΄„ν˜Έ λ¬Άμ–΄μ•Όν•œλ‹€.
add() != add

πŸ’‘ λ°˜ν™˜μ΄λž€?

return을 λͺ…μ‹œμ μ„ ν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ Undefined이 λ°˜ν™˜λ¨!

return -> ν•¨μˆ˜λ₯Ό μ’…λ£Œμ‹œν‚¬ 수 μžˆλ‹€.

function add(a, b){
  // return undefined
}
const result = add(1, 2)
console.log(result); -> undefined

function print(text){
  console.log('text');
}
const outcome = print('hello') 
console.log(outcome) -> undefined

function print(num) {
  if(num < 0){
    return; --> return을 λ§Œλ‚˜λ©΄ ν•¨μˆ˜λ₯Ό μ’…λ£Œμ‹œν‚¨λ‹€.  
  }
  else {
    console.log(num);
  }
}

πŸ’‘ ν•¨μˆ˜μ˜ 인자

λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμœΌλ©΄ λ§€κ°œλ³€μˆ˜μ˜ κΈ°λ³Έ 값은 Undefined이닀.

λ§€κ°œλ³€μˆ˜λ₯Ό 전달 λ°›μ§€ λͺ»ν•  경우λ₯Ό λŒ€λΉ„ν•˜μ—¬, λ§€κ°œλ³€μˆ˜μ˜ κΈ°λ³Έ 값을 ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ„€μ •ν•  수 μžˆλ‹€.

Rest Parameters : λͺ‡κ°œμ˜ μΈμžκ°€ 올 건지 μ•Œ 수 없을 λ•Œ, μΈμžλ“€μ„ λ°°μ—΄ ν˜•νƒœλ‘œ μ „ν™˜ν•˜μ—¬ μ €μž₯ν•œλ‹€.

function add(a, b){
  console.log(a);
  console.log(b);
  console.log(arguments); -> ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 접근이 κ°€λŠ₯ν•œ arguments κ°μ²΄λŠ” λ§€κ°œλ³€μˆ˜μ˜ 정보λ₯Ό λ‹΄κ³ μžˆλ‹€.
  return a + b;
}

add() -> λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμœΌλ©΄, λ§€κ°œλ³€μˆ˜λŠ” undefined 기본값이닀.

function add(a = 1, b = 2) -> λ§€κ°œλ³€μˆ˜κ°€ μ „λ‹¬λ˜μ§€ μ•Šμ„ λ•Œλ₯Ό λŒ€λΉ„ν•˜μ—¬ κΈ°λ³Έ κ°’ μ„€μ • κ°€λŠ₯
{
  return a + b;
}

Rest Parameters 
function sum(a, b, ...numbers) -> λͺ‡κ°œμ˜ μΈμžκ°€ 올 건지 μ•Œ 수 없을 λ•Œ μ‚¬μš©ν•œλ‹€.
... -> λ°°μ—΄ ν˜•νƒœλ‘œ μ €μž₯λœλ‹€.

πŸ’‘ ν•¨μˆ˜ ν‘œν˜„μ‹

ν•¨μˆ˜ μ„ μ–Έλ¬Έκ³Ό ν‘œν˜„μ‹μ˜ 차이점?

λͺ¨λ“  ν‘œν—Œμ‹μ€ 문에 ν¬ν•¨λ˜λ©°, κ°’μœΌλ‘œ 평가될 수 μžˆλŠ” 것듀이 ν‘œν˜„μ‹μ΄λ‹€.

ν•¨μˆ˜ μ„ μ–Έλ¬Έ function name() { }

ν•¨μˆ˜ ν‘œν˜„μ‹ const name = function () { }

let add = function (a, b) {

return a + b;

};

add에 μ „λ‹¬λ˜λŠ” 것은 μ½”λ“œλΈ”λŸ­μ— μ£Όμ†Œκ°€ ν• λ‹Ήλœλ‹€.

ν™”μ‚΄ν‘œ ν•¨μˆ˜

const name = () => { } function μƒλž΅λœ λΆ€λΆ„

μ½”λ“œλΈ”λŸ­ μ•ˆμ—μ„œ κ°’λ§Œ λ¦¬ν„΄ν•˜λŠ” 경우라면, κ΄„ν˜Έ, 리턴 μƒλž΅κ°€λŠ₯

ν•¨μˆ˜μžμ²΄λŠ” κ°’μœΌλ‘œ 계산될 수 μžˆλŠ” ν‘œν˜„μ‹μ΄λ‹€.

<ν•¨μˆ˜ 선언식 : ν˜Έμ΄μŠ€νŒ… 영ν–₯ λ°›μŒ, μ„ μ–Έ μœ„μ—μ„œ 호좜 κ°€λŠ₯>

<ν•¨μˆ˜ ν‘œν˜„μ‹ : ν˜Έμ΄μŠ€νŒ… 영ν–₯ λ°›μ§€ μ•ŠμŒ, ν΄λ‘œμ € , 콜백 μ‚¬μš© κ°€λŠ₯>

IIFE (Immedicately-Invoked Function Expressions)

// ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function add(a, b){
  return a + b;
}

// ν•¨μˆ˜ ν‘œν˜„μ‹
const add = function (a, b){
  return a + b;
}
μ΄λ•Œ add에 ν• λ‹Ήλ˜λŠ” 것은 μ½”λ“œλΈ”λŸ­μ΄ μœ„μΉ˜ν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ΄λ‹€.

// ν™”μ‚΄ν‘œ ν•¨μˆ˜
const add = (a, b) => {return a + b;}
function이 μƒλž΅λœ 버전(ν™”μ‚΄ν‘œ ν•¨μˆ˜)

// ν™”μ‚΄ν‘œ ν•¨μˆ˜2
μ½”λ“œλΈ”λŸ­μ˜ λ‚΄μš©μ΄ λ°”λ‘œ 값을 λ°˜ν™˜ν•˜λŠ” 경우라면, return κ³Ό κ΄„ν˜Έ μƒλž΅κ°€λŠ₯
const add = (a, b) => a + b;

// IIFE
(function run() {
  console.log('πŸ’‘')
}) ();
κ΄„ν˜Έλ‘œ 묢으면 ν•¨μˆ˜λŠ” κ°’(λ©”λͺ¨λ¦¬μ£Όμ†Œ)으둜 ν‘œν˜„λ˜κ³ , ()둜 κ·Έ μ£Όμ†Œλ₯Ό ν˜ΈμΆœν•¨

πŸ’‘ λ“œλ””μ–΄ μ½œλ°±ν•¨μˆ˜

ν•¨μˆ˜μ˜ 인자둜 ν•¨μˆ˜κ°€ λ“€μ–΄κ°€λŠ” 것을 μ½œλ°±ν•¨μˆ˜λΌκ³  ν•œλ‹€.

μ΄λ•Œ 인자둜 λ“€μ–΄κ°€λŠ” 것은 ν•¨μˆ˜μ˜ μ½”λ“œλΈ”λŸ­μ΄ λ“€μ–΄μžˆλŠ” μ£Όμ†Œκ°’, 즉 λ ˆνΌλŸ°μŠ€μ΄λ‹€.

ν•¨μˆ˜μ˜ 인자둜 ν•¨μˆ˜κ°€ λ“€μ–΄μ˜€λ©΄ κ·Έ μ¦‰μ‹œ 호좜이 λ˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ ν•„μš”ν•œ μˆœκ°„μ— 호좜이 λœλ‹€

// μ½œλ°±ν•¨μˆ˜ (ν•¨μˆ˜μ΄λ¦„μ„ 인자둜 λ°›λŠ”λ‹€.)
const add = (a, b) => a + b;
const multiply = (a, b) => a * b;
const pow = (a, b) => a ** b;

// μ „λ‹¬λœ action은 μ½œλ°±ν•¨μˆ˜μ΄λ‹€.
// 전달될 λ‹Ήμ‹œμ— ν•¨μˆ˜λ₯Ό λ°”λ‘œ ν˜ΈμΆœν•΄μ„œ λ°˜ν™˜λœ 값을 μ „λ‹¬λ°›λŠ” 것이 μ•„λ‹Œ, ν•¨μˆ˜λ₯Ό 가리킀고 μžˆλŠ” ν•¨μˆ˜μ˜ 레퍼런슀(μ°Έμ‘°κ°’)κ°€ μ „λ‹¬λœλ‹€.
// κ²°λ‘ , μ½œλ°±ν•¨μˆ˜λŠ” κ³ μ°¨ν•¨μˆ˜ μ•ˆμ—μ„œ ν•„μš”ν•œ μˆœκ°„μ— 호좜이 λ‚˜μ€‘μ— 됨
function calculator(a, b, action) {
  let result = 0;
  result = action(a, b);
  console.log(result);
  return result;
}
calculator(1, 3, add);
calculator(5, 4, multiply);
calculator(5, 2, pow);

πŸ’‘ ν•¨μˆ˜ λ§Œλ“€κΈ° ν€΄μ¦ˆ

function printNum(num){
    console.log(num);
}

function printTwiceNum(num){
  console.log(2 * num)
}

function iterate(max, action){
  for(let i = 0; i < max; i++){
    action(i);
  }
}

iterate(10, printNum); == iterate(10, (num) => {console.log(num);})
iterate(10, printTwiceNum); == iterate(10, (num) => {console.log(2 * num);})

μ‹€μ œ μ‚¬μš© μ˜ˆμ‹œ
setTimeout(callback, 1000); => setTimeout(() => {console.log('Hi'), 1000ms})

πŸ’‘ μ€‘μš”ν•œ λΆˆλ³€μ„±μ— λŒ€ν•΄

Immutability == unchangable λ³€κ²½ν•  수 μ—†λŠ”(λ³€κ²½ ν•˜μ§€ μ•ŠλŠ” 것이 쒋은!!)

ν•¨μˆ˜λ‚΄λΆ€μ—μ„œ μ™ΈλΆ€λ‘œλΆ€ν„° μ£Όμ–΄μ§„ 인자의 값을 λ³€κ²½ν•˜λŠ” 것은 맀우 μ’‹μ§€ μ•Šλ‹€.

μ›μ‹œ 값이 μ „λ‹¬λ˜λŠ” κ²½μš°λŠ” 본래의 λ³€μˆ˜μ—λŠ” 영ν–₯을 λΌμΉ˜μ§€ μ•Šμ§€λ§Œ, κ°μ²΄νƒ€μž…μ˜ κ²½μš°μ—λŠ” λ©”λͺ¨λ¦¬μ£Όμ†Œκ°€ μ „λ‹¬λ˜λ―€λ‘œ, ν•¨μˆ˜λ‚΄λΆ€μ—μ„œ λ³€κ²½ν•˜λ©΄, κ·Έ μ‹€μ œμ˜ 값이 변경이 λœλ‹€.

// μ›μ‹œκ°’ - 값에 μ˜ν•œ 볡사
// 객체값 - λ©”λͺ¨λ¦¬μ£Όμ†Œ(μ°Έμ‘°)에 μ˜ν•œ 볡사(λ©”λͺ¨λ¦¬μ£Όμ†Œ)

function display(num){
  num = 5;
  console.log(num);
}
const number = 3;
display(number) -> 5
console.log(number) -> 3
=> 값에 μ˜ν•œ λ³΅μ‚¬μ΄λ―€λ‘œ, μ›λž˜ 값은 λ³€ν•˜μ§€ μ•Šμ•˜λ‹€.

function displayObj(obj){
  obj.name = 'Son';
  console.log(obj);
}
const son = {
  name: 'Han'
}

displayObj(son) -> 'Son'
console.log(son.name) -> 'Son'

=> 객체 νƒ€μž…μ˜ 경우 참쑰값이 μ „λ‹¬λ˜λ―€λ‘œ, 본래의 값도 λ³€κ²½μ΄λœλ‹€.

// 정말 λ°”κΏ”μ•Ό ν•œλ‹€λ©΄?
function changeName(obj){
  return {...obj, name: 'bob'};
}

πŸ’‘Β μΌκΈ‰ 객체, κ³ μ°¨ ν•¨μˆ˜

일급 객체(ν•¨μˆ˜)λž€ ν•¨μˆ˜λ₯Ό λ³€μˆ˜λ‹€λ£¨λ“―μ΄ λ‹€λ£° 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•¨

ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— 넣을 μˆ˜λ„μžˆκ³  νŒŒλΌλ―Έν„°λ‘œ 넣어쀄 수 있음

κ³ μ°¨ν•¨μˆ˜λŠ” νŒŒλΌλ―Έν„°λ‘œ ν•¨μˆ˜λ₯Ό λ°›κ³  원할 λ•Œ μ‹€ν–‰ν•  수 μžˆλŠ” ν•¨μˆ˜μž„

profile
ν•œλ§μˆ˜μš”

0개의 λŒ“κΈ€