πŸ“’ Javascript ν•¨μˆ˜ :)

zooyahoΒ·2022λ…„ 3μ›” 26일
0

study with me

λͺ©λ‘ 보기
1/19
post-thumbnail

μ°Έκ³  λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

ν•¨μˆ˜

  • 일련의 과정을 문으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ 것이닀.
  • κ°’μ˜ μ„±μ§ˆμ„ κ°–λŠ” 객체λ₯Ό 일급 객체라고 ν•˜λ©°, ν•¨μˆ˜λŠ” 일급객체이닀.
  • ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžλ‹€.
  • ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν‘œν˜„μ‹μΈ 문이며, ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이닀!

πŸ’‘ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° : 순수 ν•¨μˆ˜μ™€ 보쑰 ν•¨μˆ˜μ˜ 쑰합을 톡해 μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ 효과λ₯Ό μ΅œμ†Œν™”ν•΄μ„œ λΆˆλ³€μ„±μ„ 지ν–₯ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€.

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

  • ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€.
  • ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이닀!!!

πŸ‘Ύ#01

function bar() {
  console.log("hello");
}

bar(); // hello

πŸ‘Ύ#02

var bar = function bar() {
  console.log("hello");
};

bar(); // hello

πŸ‘‰πŸ» μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ 선언문을 해석해 ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€. μƒμ„±λœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜ 이름과 λ™μΌν•œ μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό μ•”λ¬΅μ μœΌλ‘œ μƒμ„±ν•˜κ³ , 거기에 ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ήν•œλ‹€.

ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

ν•¨μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ λ™μž‘ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•μ„ 말함.

foo(); // TypeError: sub is not a function
bar(); // hello

var foo = function foo() {
  console.log("foo");
};
function bar() {
  console.log("bar");
}

πŸ“Ž TypeErrorλ₯Ό λ°œμƒμ‹œν‚€λŠ” 이유

πŸ‘‰πŸ» ν•¨μˆ˜ ν‘œν˜„μ‹μΈ fooλŠ” λ³€μˆ˜ 선언이 λŸ°νƒ€μž„ 이전에 μ‹€ν–‰λ˜μ–΄ undefined둜 μ΄ˆκΈ°ν™” 되며, λŸ°νƒ€μž„ μ‹œμ μ— 할당문이 μ‹€ν–‰λ˜μ–΄ ν•¨μˆ˜κ°μ²΄κ°€ λœλ‹€. λ”°λΌμ„œ μœ„ μ˜ˆμ œμ—μ„œλŠ” λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄ μ‹€ν–‰λœλ‹€.
πŸ‘‰πŸ» ν•¨μˆ˜ ν‘œν˜„μ‹ 이전에 ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ undefined둜 ν‰κ°€λ˜κ³  λ”°λΌμ„œ μ΄λ•Œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ νƒ€μž…μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

πŸ’‘ λ”°λΌμ„œ ν•¨μˆ˜ μ„ μ–Έλ¬Έ λŒ€μ‹  ν•¨μˆ˜ ν‘œν˜„μ‹ μ‚¬μš©μ„ ꢌμž₯ν•œλ‹€.

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

  • ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”μ§€ μ²΄ν¬ν•˜μ§€ μ•Šμ•„ μ—λŸ¬λ₯Ό λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€
  • μΈμˆ˜κ°€ ν• λ‹Ήλ˜μ§€ μ•Šμ€ λ§€κ°œλ³€μˆ˜μ˜ 값은 undefinedλ‹€.
  • λ§€κ°œλ³€μˆ˜λ³΄λ‹€ μΈμˆ˜κ°€ λ§Žμ€ 경우 초과된 μΈμˆ˜λŠ” λ¬΄μ‹œλœλ‹€.
  • λͺ¨λ“  μΈμˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ arguments 객체의 ν”„λ‘œνΌν‹°λ‘œ 보내진닀

λ°˜ν™˜λ¬Έ

return + ν‘œν˜„μ‹μœΌλ‘œ 이뀄짐.

  • ν‘œν˜„μ‹μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 'undefined'λ₯Ό λ°˜ν™˜.
  • λ°˜ν™˜λ¬Έμ€ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ©° μ΄λ•Œ μ•”λ¬΅μ μœΌλ‘œ 'undefined'λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • μ „μ—­μ—μ„œ λ°˜ν™˜λ¬Έμ„ μ‚¬μš©ν•˜λ©΄ λ¬Έλ²•μ—λŸ¬λ₯Ό λ°œμƒν•œλ‹€.

μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜(IIFE, Immediately-Invoked Function Expression)

  • 단 ν•œλ²ˆλ§Œ 호좜되며 λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λ‹€.
  • 읡λͺ…ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.
  • λ°˜λ“œμ‹œ κ·Έλ£Ή μ—°μ‚°μž(..)둜 감싸야 ν•œλ‹€.
/* 01 */
(function () {
  //..
})();
/* 02 */
(function () {
  //..
})();

타이머 ν•¨μˆ˜

  1. setTimeout(ν•¨μˆ˜, μ‹œκ°„): 일정 μ‹œκ°„ ν›„ ν•¨μˆ˜ μ‹€ν–‰
  2. setInterval(ν•¨μˆ˜, μ‹œκ°„): μ‹œκ°„ κ°„κ²©λ§ˆλ‹€ ν•¨μˆ˜ μ‹€ν–‰
  3. clearTimeout(): μ„€μ •λœ Timeout ν•¨μˆ˜λ₯Ό μ’…λ£Œ
  4. clearInterval(): μ„€μ •λœ Interval ν•¨μˆ˜λ₯Ό μ’…λ£Œ
  • 첫번째 인수: 읡λͺ…ν•¨μˆ˜, ν™”μ‚΄ν‘œν•¨μˆ˜ μ‚¬μš©
  • λ‘λ²ˆμ§Έ 인수: ms

πŸ”΅ setTimeout(ν•¨μˆ˜, μ‹œκ°„)

// 3초 λ’€ μ‹€ν–‰
setTimeout(function () {
  console.log('zooyaho!')
},3000)

setTimeout(() => {
  console.log('zooyaho!')
},3000)

πŸ”΅ clearTimeout()

// 3초 μ „ h1μš”μ†Œ 클릭 μ‹œ timerν•¨μˆ˜ μ’…λ£Œλ˜μ–΄ console이 μ°νžˆμ§€ μ•ŠμŒ
const timer = setTimeout(function () {
  console.log('zooyaho!')
},3000)

const h1El = document.querySelector('h1')
h1El.addEventListener('click', ()=> {
	clearTimeout(timer)
})

πŸ”΅ setInterval(ν•¨μˆ˜, μ‹œκ°„)

// 3초 λ§ˆλ‹€ μ‹€ν–‰
setInterval(() => {
  console.log('zooyaho!')
},3000)

πŸ”΅ clearInteval()

// h1μš”μ†Œ 클릭 μ‹œ timerν•¨μˆ˜ μ’…λ£Œ
const timer = setTimeout(function () {
  console.log('zooyaho!')
},3000)

const h1El = document.querySelector('h1')
h1El.addEventListener('click', ()=> {
	clearInteval(timer)
})

콜백 ν•¨μˆ˜

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜

πŸ“Ž κ³ μ°¨ ν•¨μˆ˜ : λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ μ½œλ°±ν•¨μˆ˜λ₯Ό 전달받은 ν•¨μˆ˜

πŸ‘Ύ#01

function repeat(n, f) {
  for (let i = 0; i < n; i++) {
    f(i);
  }
}
/* 01 */
repeat(5, function (i) {
  if (i % 2) console.log(i);
}); // 1 3

πŸ‘‰πŸ» 읡λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ„ 콜백 ν•¨μˆ˜λ‘œ κ³ μ°¨ ν•¨μˆ˜μ— 전달
πŸ‘‰πŸ» 읡λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ repeat ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ 객체λ₯Ό 생성

πŸ‘Ύ#02

/* 02 */
var logOdd = function (i) {
  if (i % 2) console.log(i);
};
repeat(5, logOdd); // 1, 3

πŸ‘‰πŸ» logOdd ν•¨μˆ˜λŠ” 단 ν•œ 번만 생성
πŸ‘‰πŸ» κ³ μ°¨ ν•¨μˆ˜μ— ν•¨μˆ˜ μ°Έμ‘°λ₯Ό 전달!!
πŸ‘‰πŸ» 콜백 ν•¨μˆ˜λ₯Ό 읡λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μ •μ˜ν•˜λ©΄μ„œ κ³§λ°”λ‘œ κ³ μ°¨ ν•¨μˆ˜μ— μ „λ‹¬ν•˜λ©΄ κ³ μ°¨ ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ 콜백 ν•¨μˆ˜κ°€ μƒμ„±λœλ‹€.

πŸ‘Ύ#03

// 3초 ν›„ zooyaho Done! 좜λ ₯
function timeout(cb) {
  setTimeout(()=> {
    console.log("zooyaho");
    cb();
  },3000)
}

timeout(()=> {
  console.log("Done!");
});

πŸ‘‰πŸ» ν•¨μˆ˜μ˜ λͺ¨λ“  처리 이후 λ‚΄κ°€ μ›ν•˜λŠ” λ‚΄μš©μ„ μΆ”κ°€μ μœΌλ‘œ μ‹€ν–‰ν•  수 있음.
πŸ‘‰πŸ» μ½œλ°±μ€ μ‹€ν–‰ μœ„μΉ˜λ₯Ό 보μž₯ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©ν•¨.

μˆœμˆ˜ν•¨μˆ˜μ™€ λΉ„μˆœμˆ˜ν•¨μˆ˜

순수 ν•¨μˆ˜

  • μ–΄λ–€ μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ”, 즉 λΆ€μˆ˜ νš¨κ³Όκ°€ μ—†λŠ” ν•¨μˆ˜
  • λ™μΌν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ‹€.
  • 일반적으둜 μ΅œμ†Œ ν•˜λ‚˜ μ΄μƒμ˜ 인수λ₯Ό 전달 λ°›λŠ”λ‹€.

πŸ‘Ύ#01

let count = 0;
function increase(n) {
  return ++n;
}
increase(count);
console.log(count); // 0

increase(count);
console.log(count); // 0

count = increase(count);
console.log(count); // 1

λΉ„μˆœμˆ˜ ν•¨μˆ˜

  • μ–΄λ–€ μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ”, 즉 λΆ€μˆ˜ νš¨κ³Όκ°€ μžˆλŠ” ν•¨μˆ˜
  • μ™ΈλΆ€ μƒνƒœμ— 따라 λ°˜ν™˜κ°’μ΄ λ‹¬λΌμ§€λŠ”λ°, μ™ΈλΆ€ μƒνƒœμ—λŠ” μ „μ—­λ³€μˆ˜, μ„œλ²„ 데이터, 파일, Console, DOM등이 μžˆλ‹€.

πŸ‘Ύ#02

let count = 0;
function increase() {
  return ++count;
}
increase();
console.log(count); // 1

increase();
console.log(count); // 2
profile
즐겁게 κ°œλ°œν•˜μž μ₯¬μ•Όν˜ΈπŸ‘»

0개의 λŒ“κΈ€