2018-04-28
κ°μΈμ μΈ κ³΅λΆ λ ΈνΈλ‘ μ€λ₯κ° μμ μ μμ΅λλ€.
private ν¨μμ λ³μλ₯Ό μ°Έμ‘°νλ κ², λλ μ€νμ΄ λλ λΆλͺ¨ ν¨μ μ€μ½νμ λ³μλ₯Ό μ°Έμ‘°νλ ν¨μλ₯Ό μλ―Ένλ€.
// without closure
function Person(name) {
var _name = name // _nameμ μ¨κ²¨μ§ λ³μλΌλ κ²μ κ°μ‘°νκΈ° μν΄ μ¬μ©
}
var person = new Person('Jane')
console.log(person.name) // undefined
π Person ν¨μκ° μ€νλ νμλ λΉμ°ν λ΄λΆ λ³μ name
μ μ κ·Όμ΄ λΆκ°λ₯νλ€. νμ§λ§ ν΄λ‘μ λ₯Ό μ¬μ©ν΄ λ΄λΆ λ³μμ μ κ·Όνλ ν¨μλ₯Ό λ§λ€ μ μλ€.
// with closure
function Person(name) {
var _name = name
this.getName = function() {
return _name // μ¨κ²¨μ§ λ³μ _nameμ μ κ·Όνλ€.
}
}
var person = new Person('Jane')
console.log(person.getName()) // Jane
ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ λ΄λΆ λ³μλ₯Ό μ°Έμ‘°νλ ν¨μλ₯Ό 리ν΄ν΄μ λ΄λΆ λ³μλ₯Ό κ³μ κ°μ§νλλ‘ λ§λ€μλ μλ€.(μΆμ²: μΈμ¬μ΄λ μλ°μ€ν¬λ¦½νΈ(2016))
function parent() {
const a = 100
const child = function() {
console.log(a) // parent()μ λ΄λΆ λ³μ aλ₯Ό μ°Έμ‘°νλ€.
}
return child // parent() ν¨μλ λ΄λΆ ν¨μ child()λ₯Ό 리ν΄νλ€.
}
const inner = parent() // inner() ν¨μλ 리ν΄λ child() ν¨μ
inner() // 100
parent()
ν¨μμ μ€νμ λλ¬μ§λ§ λ΄λΆ λ³μ a
λ κ°λΉμ§ 컬λ ν
μ΄ λμ§ μλλ€.inner()
ν¨μλ parent()
ν¨μμ 리ν΄κ°μΈ child()
λ₯Ό ν λΉ λ°μκ³ , κ·Έ child()
ν¨μλ λ³μ a
λ₯Ό μ°Έμ‘°νκ³ μκΈ° λλ¬Έμ 100μ μΆλ ₯νκ² λλ€.π κ°λΉμ§ 컬λ μ (garbage collection): λ©λͺ¨λ¦¬ κ΄λ¦¬ κΈ°λ² μ€μ νλλ‘, νλ‘κ·Έλ¨μ΄ λμ μΌλ‘ ν λΉνλ λ©λͺ¨λ¦¬ μμ μ€μμ νμμκ² λ μμμ ν΄μ νλ κΈ°λ₯μ΄λ€.
const a = function() {
const counter = 0
return function() {
counter += 1
return counter
}
}
const b = a()
b() // function() { counter += 1; return counter }
// μ΄ counterλ μ΄λμ μμ§? μ¬μ ν μ κ·Ό κ°λ₯νμ§λ§ counter λ³μλ λλ½νμ§μ§ μλλ€.
bλ a λ΄λΆμμ 리ν΄λλ ν¨μκ° λλ€. counter = 0; function() { counter += 1; return counter}
μ incrementing νλ κΈ°λ₯μ κ°μ§λ§ μΈλΆμμ counterμ μ κ·Όμ΄ λΆκ°λ₯νκΈ° λλ¬Έμ μ μ λ³μλ₯Ό λλ½νμ§ μμ μ μλ€λ μ°¨μ΄κ° μλ€. λ³μ λΏλ§ μλλΌ ν¨μ, κ°μ²΄λ μ΄λ°μμΌλ‘ μ¨κΈΈ μ μλ€. μ΄λ°μμΌλ‘ private λ³μλ ꡬν κ°λ₯.
ν΄λ‘μ λ μ΄λ²€νΈ 리μ€λμ μ½λ°±μ μΈμλ₯Ό κ°μ΄ λκ²¨μ€ λ μ¬μ©ν μ μλ€.
// anchor νκ·Έλ₯Ό ν΄λ¦ν λ, 리νλ μλ₯Ό νμ§ μκ³ κ° anchorμ indexλ₯Ό λμ°λ μμ
function registerHandlers() {
const anchors = document.querySelectorAll('a')
Array.from(anchors, (a, index) => {
a.addEventListener('click', (event) => alertIndex(event, index))
})
}
function alertIndex(event, index) {
event.preventDefault()
return alert(index)
}
registerHandlers()