Javascript Patterns(2011)
2017-11-15
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ฉ ๊ธฐ๋ฒ๊ณผ ํต์ฌ ํจํด(2011) ์ฑ ์ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๐ 3์ฅ - Literals and Constructors
ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด๋ค. ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๊ณ , ๋ณ์์ ํ ๋นํ ์๋ ์๊ณ , ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ ์๋ ์๋ค. ์ธ์๊ฐ ๋๋ ํจ์๋ฅผ ์ฝ๋ฐฑํจ์, ๋๋ ์ฝ๋ฐฑ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ช ์์ ์ผ๋ก ํธ์ถํ๋ ํจ์๊ฐ ์๋๋ผ ํจ์๋ฅผ ์ผ๋จ ๋ฑ๋กํ๊ณ , ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ํน์ ์์ ์ ๋๋ฌํ์ ๋ ํธ์ถ๋๋ ํจ์์ด๋ค. ๋๋ ํน์ ํจ์์ ์ธ์๋ก ๋๊ฒจ์ ์ฝ๋ ๋ด๋ถ์์ ํธ์ถ๋๋ ํจ์๋ ์ฝ๋ฐฑํจ์๋ผ๊ณ ํ๋ค. ๋ํ์ ์ธ ์ฝ๋ฐฑ ํจ์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ event handler์ด๋ค. - ์ธ์ฌ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ(2016)
function writeCode(callback) {
// ...
callback()
// ...
}
function introduceBugs() {
// ...
}
writeCode(introduceBugs)
()
๋ฅผ ๋ถ์ด๋ฉด ์ฆ์ ์คํ, ๋ถ์ด์ง ์์ผ๋ฉด ์ฐธ์กฐ๋ง ํ๊ณ , ๋ฐ๊นฅ ํจ์์์ ์๋ง์ ๋์ ์คํํด์ค๋ค.// ์ฝ๋ฐฑ ์์ด ์ฌ์ฉ
// array์ธ nodes๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์์์ nodes๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ถ๋ฌ์จ๋ค.
let findNodes = function() {
const i = 100000,
nodes = [],
found
while (i) {
// ๋
ธ๋๋ฅผ ์์ ํ๋ ๋ก์ง - ๋ฐ๋ก ๋๋ค.
nodes.push(found)
}
return nodes // nodes ๋ฆฌํด
}
let hide = function(nodes) { // nodes๋ฅผ ์ธ์๋ก ๋ฐ์
let i = 0,
max = nodes.length
for (i < max; i += 1) {
nodes[i].style.display = 'none'
}
}
// ํจ์ ์คํ
hide(findNodes())
// ์ฝ๋ฐฑ์ผ๋ก ๋ฆฌํฉํ ๋ง
let findNodes = function (callback) {
const i = 100000,
nodes = [],
found
if (typeof callback !== "function") {
callback = false
}
while (i) {
i -= 1
// ๋
ธ๋ ์์ ๋ก์ง
if (callback) {
callback(found)
}
nodes.push(found)
}
return nodes
}
// ์ฝ๋ฐฑ ํจ์
let hide = function(node) {
node.style.display = 'none'
}
findNodes(hide)
// hide()๋ฅผ ์ ์ํ์ง ์๊ณ ์ด๋ ๊ฒ ์ต๋ช
ํจ์๋ก ํํํ ์๋ ์๋ค.
findNodes(function(node) {
node.style.display = 'none'
})
๋ง์ฝ ์ฝ๋ฐฑํจ์๊ฐ ๊ฐ์ฒด์ ๋ฉ์๋์ธ ๊ฒฝ์ฐ, ์ฝ๋ฐฑ์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๋ this๋ฅผ ์ฌ์ฉํ๊ณ ์์ ๋ ๋ฌธ์ ๊ฐ ๋๋ค.
let myapp = {}
myapp.color = 'green'
myapp.paint = function(node) {
node.style.color = this.color
}
findNodes(myapp.paint) // ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ฝ๋ฐฑํจ์๋ก ๊ฐ์ง๋ค. myapp.paint ๋ด this๋ findNodes์์ ๋ฐ๋ผ๋ณด๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ๊ฒ์ด๋ค.
findNodes(myapp.paint, myapp)
let findNodes = function(cbMethod, cbObject) {
if (typeof cbMethod === "function") {
cbMethod.call(cbObject, found)
}
}
findNodes("paint", myapp)
let findNodes = function(cbMethod, cbObject) {
if (typeof cbMethod === "string") {
cbMethod = cbObject[cbMethod]
}
//
if (typeof cbMethod === "function") {
cbMethod.call(cbObject, found)
}
}
ํ์ด์ง element์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ด๋ ๊ฒ์ ์ฌ์ค, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ํธ์ถ๋ ์ฝ๋ฐฑํจ์์ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด๋ค.
document.addEventListener("click", console.log, false)
๋๋ถ๋ถ์ ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ํ๋ก๊ทธ๋๋ฐ์ event-driven ๋ฐฉ์์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ event-driven ํ๋ก๊ทธ๋๋ฐ์ ์ ํฉํ ์ด์ ๋ ํ๋ก๊ทธ๋จ์ด ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ ์ ์๊ฒ ํ๋ ์ฝ๋ฐฑ ํจํด ๋๋ถ์ด๋ค.
setTimeout
๊ณผ setInterval
๋ ๋ํ์ ์ธ ์ฝ๋ฐฑ ํจํด์ด๋ค.
let thePlotThickens = function() {
console.log('500ms later...');
}
setTimeout(thePlotThickens, 500)
์ฌ๊ธฐ์ thePlotThickens
๊ฐ ()์์ด ์ ๋ฌ๋์๋ค. ์ฆ์ ์คํํ์ง ์๊ณ 500ms๊ฐ ์ง๋ ํ์ ํธ์ถํ ์ ์๋๋ก ํจ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋ง ์๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ "thePlotThickens()"
์ ๊ฐ์ด ๋ฌธ์์ด์ ์ ๋ฌํ๋ ๊ฑด eval()๊ณผ ๊ฐ์ ์ํฐํจํด์ด๋ค.
์ฝ๋ฐฑํจํด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค๊ณํ ๋ ๋งค์ฐ ์ ์ฉํ๊ณ ๊ฐ๋ ฅํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ด๊ฐ ์ฝ๋๋ ์ต๋ํ ๋ฒ์ฉ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ง์ ์ ๊ณตํ๋ ์ฝ๋ฐฑ ํจํด์ OCP ์์น์ ์ ๊ฐํ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๋ค.