December 12, 2020
ํด๋ก์ ๋, ํด๋น ํจ์๊ฐ ์ํ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ์ฌ, ํจ์๊ฐ ๋ ์์ปฌ ์ค์ฝํ ๋ฐ์์ ์คํ๋ ๋์๋ ์ด ์ค์ฝํ์ ์ ๊ทผ ํ ์ ์๊ฒํ๋ ๊ธฐ๋ฅ์ด๋ค.
์๋ ์์๋ฅผ ํตํด์ ํด๋ก์ ์ ๋ํด ๋ ์์๋ณด๋๋ก ํ์
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์ ์ ๊ทผ ๊ฐ๋ฅ) ๊ฒ์ด๋ค.
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๋ฒํจ์๊ฐ ๋ชจ๋ ์ข
๋ฃ ๋ ํ์๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์๊ฑฐ๋์ง ์๋๋ค.
// 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๋ฒ ํจ์์ ๊ฒ์ ์ฐธ์กฐํ๋ฏ๋ก ๋๋ฐ์ด์ฑ์ ๊ตฌํํ๋ค.
์ปค๋ง ํจ์๋ ์ฌ๋ฌ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์๋ฅผ ํ๋์ ์ธ์๋ง ๋ฐ๋ ํจ์๋ก ๋๋์ด์ ์์ฐจ์ ์ผ๋ก ํธ์ถ ํ ์ ์๊ฒ ์ฒด๋ ํํ๋ก ๊ตฌ์ฑํ ํจ์๋ฅผ ์ผ์ปซ๋๋ค.
์๋ ์์ ๋ ์ปค๋งํจ์๋ฅผ ์ด์ฉํด์ ๋ค์ด์ค๋ ์ธ์๊ฐ 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) // falsecurry ํจ์๋ 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
๊ฒฐ๊ณผ๊ฐ 6์ ๋ฐ๋ณต๋ฌธ์ด ๋๋ฌ์ ๋ ๋ณ์ i ์ ๊ฐ์ด๋ค. ๋ํ setTimeout์ ์ฝ๋ฐฑ ํจ์๋ ๋ฐ๋ณต๋ฌธ์ด ๋๋๊ณ ๋์์ผ ์๋ํ๋ค. ์ฆ 5๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ ๋ชจ๋ ๊ธ๋ก๋ฒ ์ค์ฝํ ํด๋ก์ ๋ฅผ ๊ณต์ ํ์ฌ ํ๋๋ฐ์ ์กด์ฌํ์ง ์๋ i ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด๋ค. (ES6 ์ด์ ์๋ ํจ์ ์ค์ฝํ ๋ฐ์ ์กด์ฌํ์ง ์์์ผ๋ฏ๋ก, ๋ฐ๋ณต๋ฌธ๋ง๋ค ์๋ก์ด ์ค์ฝํ๊ฐ ์๊ธฐ์ง ์๋๋ค. ) ๊ทธ๋ ๋ค๋ฉด ์ด๋ฅผ ์๋ ์๋๋๋ก ์ถ๋ ฅํ๊ฒ ํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ฐ๊ฐ ๋ฐ๋ณต๋ฌธ๋ง๋ค ๋ซํ ์ค์ฝํ๋ฅผ ์์ฑํด์ผํ๋ค. ๋ฐ๋ผ์ โํจ์โ๋ฅผ ์ ์ํด์ผํ๊ณ , ๋ฐ๋ก ์คํํด์ผ ํ๋ฏ๋ก ์ฆ์์คํํจ์ (IIFE)๋ฅผ ์ ์ํด์ผ ํ๋ค.
for (var i = 1; i <= 5; i++) {
;(function() {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
})()
}6
6
6
6
6
๋ถ๋ช
์ฆ์์คํํจ์๋ก ๊ฐ๊ฐ ๋ฐ๋ณต๋ฌธ๋ง๋ค ๋ซํ ์ค์ฝํ๋ฅผ ์์ฑํ์์๋ ๋ถ๊ตฌํ๊ณ ๋๊ฐ์ด 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
๋ฐ๋ณต๋ฌธ๋ง๋ค ์๋ก์ด ์ค์ฝํ๋ฅผ ์์ฑํ๋ค๊ณ ํด๊ฒฐ๋๋๊ฒ ์๋๋ผ ๊ฐ๊ฐ ์ค์ฝํ์ ๋ณ์ i ๋ฅผ ๋ณต์ฌํ์ฌ ๋ณต์ฌ๋ ์ํ๋ก ์กด์ฌํ๊ฒ ํจ์ผ๋ก์จ ํด๋น ๋ฐ๋ณต๋ฌธ์ผ ๋ i ๊ฐ์ ์ ์ง ํ ์ ์๋ค.
์ฐ๋ฆฌ๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ๋ณต๋ฌธ๋ง๋ค ์๋ก์ด ์ค์ฝํ๋ฅผ ์์ฑํด์ผ ํ๋ค. ๊ทธ๋์ ์ฆ์์คํํจ์๋ฅผ ์ด์ฉํ๋ค. ๊ทธ๋ ๋ค๋ฉด ES6์์๋ถํฐ ์ ๊ณต๋๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ์ด์ฉํ๋ฉด ๋ธ๋ก ๋จ์๋ก ์ค์ฝํ๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก ๋ ์ฝ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์ ๊ฒ์ด๋ค.
for (let i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i)
}, i * 1000)
}1
2
3
4
5
ES6์์ let๊ณผ const์ ์ ์ฉ๋๋ ๋ธ๋ก์ค์ฝํ์ ์ํด์ ์ด์ ๊ฐ๊ฐ ๋ฐ๋ณต๋ฌธ๋ง๋ค i ๋ ์๋ก ๋ค๋ฅธ ์ค์ฝํ์ i ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ํ ES6์์ let์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ํ ๋ฒ๋ง ์ ์ธ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋ณตํ ๋ ๋ง๋ค ์ ์ธ๋๋ค. ์ฆ, ๋ฐ๋ณต๋ง๋ค ์ด์ ๋ฐ๋ณต์ด ๋๋ ์ดํ์ ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํด๋ก์ ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด๋ณด์๋ค. ํด๋ก์ ๋ ๊ฒฐ์ฝ ์๋ก์ด ๊ฐ๋
์ด ์๋๋ผ, ์ฐ๋ฆฌ๊ฐ ์ฌํ๊ป ์์ฑํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ ์์ฐ์ค๋ฝ๊ฒ ๋
น์์ ธ ์๋ ๊ฒ์ด๋ค. ์ด๋ ๋ฏ ํด๋ก์ ๋ผ๋ ๊ฐ๋
์ ๊น์ด ์๋ค๋ฉด ๋ ์ข์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ง ์์๊น์ถ๋ค.