์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋กœ์ € ์ดํ•ดํ•˜๊ธฐ

Goal

  • ํด๋กœ์ €์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•œ๋‹ค.
  • ํด๋กœ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํด๋กœ์ €๋ฅผ ๋” ๊นŠ์ด ์ดํ•ดํ•œ๋‹ค.


ํด๋กœ์ €

ํด๋กœ์ €๋ž€, ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์†ํ•œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ, ํ•จ์ˆ˜๊ฐ€ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ์‹คํ–‰๋  ๋•Œ์—๋„ ์ด ์Šค์ฝ”ํ”„์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด์„œ ํด๋กœ์ €์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž

function charm() {
  const name = 'Lumos!'
  function wisper() {
    console.log(name) // 1๋ฒˆ
  }
  return wisper
}

const MyWisper = charm() // 2๋ฒˆ
MyWisper() //"Lumos!"

๐Ÿ“ 1๋ฒˆ
wisper ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜ name์„ ์„ ์–ธ ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, wisper์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ์ค‘ Outer Environment Reference์— ์ง€์ •๋œ ์ƒ์œ„ ์ปจํ…์ŠคํŠธ์ธ ํ•จ์ˆ˜ charm์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ์ ‘๊ทผํ•˜์—ฌ ๋ณ€์ˆ˜ name์„ ์ฐพ์•˜๋‹ค.
์ด ์—ญ์‹œ ํด๋กœ์ €์˜ ๊ธฐ๋Šฅ์ค‘ ์ผ๋ถ€์ด๋‹ค. ํ•จ์ˆ˜ wisper๋Š” charm ์Šค์ฝ”ํ”„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ํด๋กœ์ €๋„ ๊ฐ€์ง„๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•จ์ˆ˜ wisper์˜ ์Šค์ฝ”ํ”„๊ฐ€ ํ•จ์ˆ˜ charm ์Šค์ฝ”ํ”„์—์„œ ๋‹ซํžˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰ ์—ฌ๊ธฐ์„œ๋Š” ํ•จ์ˆ˜ wisper๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜ ๋•๋ถ„์— ํ•จ์ˆ˜ charm๊ณผ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์— ๋Œ€ํ•œ ํด๋กœ์ €๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿ“2๋ฒˆ
ํ•จ์ˆ˜ charm๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’ , ์ฆ‰ wisper ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด ์ž์ฒด๋ฅผ MyWisper๋ผ๋Š” ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๊ณ , ์‹ค์žฌ๋กœ MyWisper() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
์ด๋Š” ๊ณง ๋‹ค๋ฅธ ํ™•์ธ์ž ์ฐธ์กฐ๋กœ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ wisper() ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ ํ•จ์ˆ˜ wisper๋Š” ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ๋ฐ–์—์„œ ์‹คํ–‰๋˜์—ˆ๋‹ค. ์›๋ž˜๋Œ€๋กœ๋ผ๋ฉด ํ•จ์ˆ˜ charm ์ด ์‹คํ–‰๋œ ํ›„์— ํ•จ์ˆ˜ charm์˜ ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์‚ฌ๋ผ์ ธ์•ผ ํ•˜๋Š”๊ฒŒ ๋งž์ง€๋งŒ, ํ•จ์ˆ˜ wisper๊ฐ€ ํ•จ์ˆ˜ charm์˜ ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ charm์€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค. ํ•จ์ˆ˜ wisper๊ฐ€ ์„ ์–ธ๋œ ์œ„์น˜ ๋•Œ๋ฌธ์— wisper๋Š” charm์— ๋Œ€ํ•œ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ํด๋กœ์ €๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ charm์€ ํ•จ์ˆ˜ wisper๊ฐ€ ๋‚˜์ค‘์—๋ผ๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šค์ฝ”ํ”„๋ฅผ ์‚ด๋ ค๋‘๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” MyWisper๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์›๋ž˜ ์ฝ”๋“œ์˜ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š”(๋ณ€์ˆ˜ name์— ์ ‘๊ทผ ๊ฐ€๋Šฅ) ๊ฒƒ์ด๋‹ค.



ํด๋กœ์ €๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ ํ• ๊นŒ

1. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ

const names = ['Harry', 'Hermione', 'Ron', 'Luna', 'Nevile']
const $ul = document.createElement('ul')

names.forEach(name => {
  // 1๋ฒˆ ํ•จ์ˆ˜
  const $li = document.createElement('li')
  $li.innerText = name
  $li.addEventListener('click', function() {
    // 2๋ฒˆ ํ•จ์ˆ˜
    alert('This is ' + name)
  })
  $ul.appendChild($li)
})

document.body.appendChild($ul)

์œ„์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ul ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ul ์—˜๋ฆฌ๋จผํŠธ์˜ ์ž์‹์œผ๋กœ li ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๋•Œ li ์—˜๋ฆฌ๋จผํŠธ์˜ innerText๋Š” names์ด๋ฉฐ , ๊ฐ๊ฐ์˜ li ์—˜๋ฆฌ๋จผํŠธ์—๋Š” ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋ถ™์–ด์„œ ํ•ด๋‹น ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹นํ•˜๋Š” name์„ alert๋กœ ๋„์›Œ์ค€๋‹ค.

๐Ÿ“ 1๋ฒˆ ํ•จ์ˆ˜
names ๋ฐฐ์—ด์„ forEach๋กœ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ names์˜ ๊ฐœ์ˆ˜๋งŒํผ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜๋ฏ€๋กœ names์˜ ๊ฐœ์ˆ˜๋งŒํผ ๊ฐ๊ฐ ์ƒˆ๋กœ์šด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“2๋ฒˆ ํ•จ์ˆ˜
ํด๋ฆญ ์ด๋ฒคํŠธ์— ์˜ํ•ด ๊ฐ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด ๋•Œ 1๋ฒˆ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ข…๋ฃŒ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ 2๋ฒˆ ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ๋‚ด๋ถ€ Outer Environment Reference๊ฐ€ 1๋ฒˆ ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ฐธ์กฐํ•œ๋‹ค. 2๋ฒˆ ํ•จ์ˆ˜๋Š” ๊ฒฐ๊ตญ 1๋ฒˆ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ 2๋ฒˆ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐํ•  ๋ณ€์ˆ˜ name์€ ๊ฐ๊ฐ์˜ 1๋ฒˆ ํ•จ์ˆ˜, ์ฆ‰ 5๊ฐœ์˜ 1๋ฒˆํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์ข…๋ฃŒ ๋œ ํ›„์—๋„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ˆ˜๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค.


2. ๋””๋ฐ”์šด์‹ฑ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ ์•Œ ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €

// sendRequest๋Š” API ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ•จ์ˆ˜

const debouncing = (func, limit) => {
  // 1๋ฒˆํ•จ์ˆ˜
  let inDebounce
  return function(event) {
    // 2๋ฒˆ ํ•จ์ˆ˜
    const value = event.target.value
    const context = this
    if (inDebounce) {
      // 900ms๊ฐ€ ์ง€๋‚˜์ง€ ์•Š์•˜๋Š”๋ฐ input ์ด๋ฒคํŠธ๊ฐ€ ๋“ค์–ด์™”๋‹ค๋ฉด
      clearTimeout(inDebounce) // ๋‹ค์‹œ 900ms ์„ธ๊ธฐ
    }
    inDebounce = setTimeout(func.bind(context, value), limit) // Input ์ด๋ฒคํŠธ ๋ฐœ์ƒํ›„ ์ตœ์†Œ 900ms ์ดํ›„์— ajax ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
  }
}

$input.addEventListener('input', debouncing(sendRequest, 900))

๋””๋ฐ”์šด์‹ฑ ๊ฐœ๋…์€ ๋””๋ฐ”์šด์‹ฑ ๊ด€๋ จ ํฌ์ŠคํŠธ ์— ์„ค๋ช… ๋˜์–ด์žˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” ๋””๋ฐ”์šด์‹ฑ์„ ํด๋กœ์ €๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

โœ”๏ธ ๋จผ์ € $input์˜ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ debouncing์ด๋ผ๋Š” 1๋ฒˆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ๋•Œ sendRequest ํ•จ์ˆ˜์™€ limit ์‹œ๊ฐ„์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. debouncing ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋จ๊ณผ ํ•จ๊ป˜ 2๋ฒˆ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค deboucing ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•œ 2๋ฒˆ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋œ๋‹ค.

โœ”๏ธ 2๋ฒˆ ํ•จ์ˆ˜๋Š” debouncing - 1๋ฒˆ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜์—ˆ๊ณ , 2๋ฒˆ ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ๋‚ด๋ถ€ Outer Environment Reference๊ฐ€ 1๋ฒˆ ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, 1๋ฒˆ ํ•จ์ˆ˜์— ์ •์˜๋œ ๋ณ€์ˆ˜ inDebounc์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ func, limit์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ”๏ธ ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค 2๋ฒˆํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด๋„ func, limit, ๊ทธ๋ฆฌ๊ณ  inDebounce๋Š” ๊ธฐ์กด์˜ 1๋ฒˆ ํ•จ์ˆ˜์˜ ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ๋””๋ฐ”์šด์‹ฑ์„ ๊ตฌํ˜„ํ•œ๋‹ค.


3. ์ปค๋ง (Currying) ํ•จ์ˆ˜

์ปค๋ง ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ์ธ์ž๋งŒ ๋ฐ›๋Š” ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฒด๋‹ˆ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ ์ผ์ปซ๋Š”๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ๋Š” ์ปค๋งํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋“ค์–ด์˜ค๋Š” ์ธ์ž๊ฐ€ 10๋ณด๋‹ค ๋” ํฐ์ง€ / 10๋ณด๋‹ค ๋” ์ž‘์€์ง€ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ ๋‹ค.

var curry = function(func) {
  // 1๋ฒˆ
  return function(a) {
    // 2๋ฒˆ
    return function(b) {
      // 3๋ฒˆ
      return func(a, b)
    }
  }
}

var getMaxWith10 = curry(Math.max)(10)
var getMinWith10 = curry(Math.min)(10)
getMaxWith10(8) // false
getMaxWith10(15) // true
getMinWith10(8) // true
getMinWith10(15) // false

curry ํ•จ์ˆ˜๋Š” 3๋ฒˆ ํ•จ์ˆ˜๊ฐ€ 2๋ฒˆ๊ณผ 1๋ฒˆ ํ•จ์ˆ˜์˜ ์ธ์ž์ธ a์™€ func์„ ์ฐธ์กฐํ•˜๋ฏ€๋กœ์จ ๊ฐ๊ฐ์˜ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ํด๋กœ์ €๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋˜ getMaxWith10๊ณผ getMinWith10์„ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์›๋ž˜ ์ฝ”๋“œ์˜ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ด๋‹ค.



ํด๋กœ์ €์™€ ๋ฐ˜๋ณต๋ฌธ

for ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ ํด๋กœ์ €๋ฅผ ๋” ๊นŠ์ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์•„๋ž˜ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ 1์ดˆ ํ›„์—๋Š” 1์ด 2์ดˆํ›„์—๋Š” 2๊ฐ€.. ์ด๋ ‡๊ฒŒ 5๊นŒ์ง€ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผํ• ๊นŒ?


์ฒซ๋ฒˆ์งธ ์‹œ๋„

for (var i = 1; i <= 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, i * 1000)
}

๊ฒฐ๊ณผ

6
6
6
6
6

์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”๊ฐ€?

     7


๊ฒฐ๊ณผ๊ฐ’ 6์€ ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚ฌ์„ ๋•Œ ๋ณ€์ˆ˜ i ์˜ ๊ฐ’์ด๋‹ค. ๋˜ํ•œ setTimeout์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚˜๊ณ  ๋‚˜์„œ์•ผ ์ž‘๋™ํ•œ๋‹ค. ์ฆ‰ 5๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„ ํด๋กœ์ €๋ฅผ ๊ณต์œ ํ•˜์—ฌ ํ•˜๋‚˜๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” i ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (ES6 ์ด์ „์—๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ๋ฐ˜๋ณต๋ฌธ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šค์ฝ”ํ”„๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ) ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฅผ ์›๋ž˜ ์˜๋„๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋ฐ˜๋ณต๋งˆ๋‹ค i ์˜ ๋ณต์ œ๋ณธ์„ ์žก์•„๋‘๋Š” ๋‹ซํžŒ ์Šค์ฝ”ํ”„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ฐ๊ฐ ๋ฐ˜๋ณต๋ฌธ๋งˆ๋‹ค ๋‹ซํžŒ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ โ€˜ํ•จ์ˆ˜โ€™๋ฅผ ์ •์˜ํ•ด์•ผํ•˜๊ณ , ๋ฐ”๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜ (IIFE)๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋‘๋ฒˆ์งธ ์‹œ๋„

for (var i = 1; i <= 5; i++) {
  ;(function() {
    setTimeout(function timer() {
      console.log(i)
    }, i * 1000)
  })()
}

๊ฒฐ๊ณผ

6
6
6
6
6

     3


๋ถ„๋ช… ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜๋กœ ๊ฐ๊ฐ ๋ฐ˜๋ณต๋ฌธ๋งˆ๋‹ค ๋‹ซํžŒ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋˜‘๊ฐ™์ด 6์ด ๋‹ค์„ฏ๋ฒˆ ์ถœ๋ ฅ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์—ฌ๊ธฐ์„  ์Šค์ฝ”ํ”„๋งŒ ์ƒ์„ฑํ–ˆ๋‹ค๋ฟ์ด์ง€, ์‹ค์งˆ์ ์œผ๋กœ ๊ฐ๊ฐ ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ i ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์Šค์ฝ”ํ”„๋งˆ๋‹ค i ๋ฅผ ํ•ด๋‹น ์Šค์ฝ”ํ”„์— ์ €์žฅ ํ•ด์„œ ๋‹ซ์•„๋†“์•„์•ผ ํ•œ๋‹ค.


์„ธ๋ฒˆ์งธ ์‹œ๋„

for (var i = 1; i <= 5; i++) {
  ;(function(j) {
    setTimeout(function timer() {
      console.log(j)
    }, i * 1000)
  })(i)
}

๊ฒฐ๊ณผ

1
2
3
4
5

     4


๋ฐ˜๋ณต๋ฌธ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•ด๊ฒฐ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฐ๊ฐ ์Šค์ฝ”ํ”„์— ๋ณ€์ˆ˜ i ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ณต์‚ฌ๋œ ์ƒํƒœ๋กœ ์กด์žฌํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ํ•ด๋‹น ๋ฐ˜๋ณต๋ฌธ์ผ ๋•Œ i ๊ฐ’์„ ์œ ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ES6 ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ์ด์šฉํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์šฐ๋ฆฌ๋Š” ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋ณต๋ฌธ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ES6์—์„œ๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ธ”๋ก ๋‹จ์œ„๋กœ ์Šค์ฝ”ํ”„๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

for (let i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i)
  }, i * 1000)
}

๊ฒฐ๊ณผ

1
2
3
4
5

     5


ES6์—์„œ let๊ณผ const์— ์ ์šฉ๋˜๋Š” ๋ธ”๋ก์Šค์ฝ”ํ”„์— ์˜ํ•ด์„œ ์ด์ œ ๊ฐ๊ฐ ๋ฐ˜๋ณต๋ฌธ๋งˆ๋‹ค i ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„์˜ i ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ ES6์—์„œ let์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•œ ๋ฒˆ๋งŒ ์„ ์–ธ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ˜๋ณตํ•  ๋•Œ ๋งˆ๋‹ค ์„ ์–ธ๋œ๋‹ค. ์ฆ‰, ๋ฐ˜๋ณต๋งˆ๋‹ค ์ด์ „ ๋ฐ˜๋ณต์ด ๋๋‚œ ์ดํ›„์˜ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์ด๋‹ค.



์ด๋ ‡๊ฒŒ ํด๋กœ์ €์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. ํด๋กœ์ €๋Š” ๊ฒฐ์ฝ” ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ, ์šฐ๋ฆฌ๊ฐ€ ์—ฌํƒœ๊ป ์ž‘์„ฑํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์•ˆ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋…น์•„์ ธ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๋“ฏ ํด๋กœ์ €๋ผ๋Š” ๊ฐœ๋…์„ ๊นŠ์ด ์•ˆ๋‹ค๋ฉด ๋” ์ข‹์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ์‹ถ๋‹ค.


Reference


This is@moonee
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ณต๋ถ€ ๋ธ”๋กœ๊ทธ

GitHub