λ΄ μΉκ΅¬μ λλ νμ¬ JSμ νμμ κ·Έλ μ§ μμ κ²μ λ Όμνκ³ μμ΅λλ€. μ°λ¦¬λ κ·Έκ²μ μ ννκ² μ΄ν΄νκ³ μΆμ΄ν©λλ€.
μ΄ μμ λ₯Ό 보μ. μΉ΄μ΄νΈ 루νκ° μκ³ μ§μ°λ μ½μμμ μΉ΄μ΄ν° λ³μλ₯Ό μΈμνλ €κ³ ν©λλ€. λ°λΌμ μΉ΄μ΄ν° λ³μμ κ°μ μΊ‘μ²νμ¬ ν΄λ‘μ λ₯Ό μ¬μ© setTimeoutνμ¬ Nμ N λ°°λ₯Ό NμΌλ‘ μΈμνμ§ μλλ‘ν©λλ€.
μλ μλͺ»λ μ루μ νμ λλ κ·Όμ²μ μ무κ²λ νμκ° λ κ²μ΄λ€ :
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
λ¬Όλ‘ i루ν ν κ°μ 10 λ°° , μ¦ 10μ μΈμν©λλ€.
κ·Έμ μλλ λ€μκ³Ό κ°μ΅λλ€.
for(var i = 0; i < 10; i++) {
(function(){
var i2 = i;
setTimeout(function(){
console.log(i2);
}, 1000)
})();
}
μμλλ‘ 0μμ 9κΉμ§ μΈμν©λλ€.
λλ κ·Έκ° μΊ‘μ³ λ₯Ό μν΄ ν΄λ‘μ λ₯Ό μ¬μ©νκ³ μμ§ μλ€κ³ λ§ iνμ§λ§ κ·Έλ μμ μ μ£Όμ₯νλ€. λλ for 루ν λ³Έλ¬Έμ λ€λ₯Έ 루ν μμ λ£κ³ (μ΅λͺ
ν¨μλ₯Όμ μ λ¬ ) 10 λ² 10μ λ€μ μΈμ νμ¬ ν΄λ‘μ λ₯Ό μ¬μ©νμ§ μλλ€λ κ²μ μ¦λͺ
νμ΅λλ€. λλ κ·Έμ κΈ°λ₯μ μ μ₯νλ κ²½μ° λμΌνκ² μ μ© νκ³ μ€ν ν ν λ΄ μΈμκ° μλ€λ κ²μ
λλ€ κ·Έλμλ 10 λ°° (10)λ₯Ό μΈμ, 루ν κ·Έκ° μ λ§νμ§ μμ΅λλ€ μΊ‘μ² μ κ°μ μμ μ λ²μ λ§λ€κΈ°, νμ§ ν΄λ‘μ λ₯Ό.setTimeoutsetTimeoutvari
λμ μλλ :
for(var i = 0; i < 10; i++) {
setTimeout((function(i2){
return function() {
console.log(i2);
}
})(i), 1000);
}
κ·Έλμ i( i2ν΄λ‘μ λ΄μμ λͺ
λͺ
λ) μΊ‘μ² νμ§λ§ μ΄μ λ€λ₯Έ ν¨μλ₯Ό λ°ν νκ³ μ΄κ²μ μ λ¬ν©λλ€. νμμ κ²½μ° setTimeoutμ μ λ¬ λ ν¨μκ° μ€μ λ‘ μΊ‘μ²ν©λλ€ i.
μ΄μ λκ° ν΄λ‘μ λ₯Ό μ¬μ©νκ³ μκ³ λκ° μ¬μ©νμ§ μμ΅λκΉ?
λ μ루μ λͺ¨λ μ½μμμ 0μμ 9κΉμ§ μ§μ°λμ΄ μλ λ¬Έμ λ₯Ό ν΄κ²°νμ§λ§μ΄ λ μ루μ μ€ ν΄λ‘μ λ₯Ό μ¬μ© νμ¬μ΄λ₯Ό μννλ μ루μ μ μ΄ν΄νκ³ μΆμ΅λλ€ .
λ΅λ³
νΈμ§μ μ£Ό : JavaScriptμ λͺ¨λ κΈ°λ₯μμ΄ κ²μλ¬Ό μμ μ€λͺ ν νμ μ λλ€. κ·Έλ¬λ μ°λ¦¬λ μ΄λ‘ μ κ΄μ μμ ν₯λ―Έλ‘μ΄ μ΄λ¬ν κΈ°λ₯μ νμ μ§ν©μ μλ³νλ λ°μλ§ κ΄μ¬ μ΄ μμ΅λλ€. λ°λΌμ, λ¨μ΄ ν΄λ‘μ μ λν μΈκΈμ λ¬λ¦¬ μΈκΈλμ§ μλ ν μ΄λ¬ν κΈ°λ₯μ μλΈ μΈνΈλ₯Ό μ§μΉ ν κ²μ΄λ€.
ν΄λ‘μ μ λν κ°λ¨ν μ€λͺ :
- κΈ°λ₯μ μννμμμ€. FλΌκ³ λΆλ₯΄κ² μ΅λλ€.
- Fμ λͺ¨λ λ³μλ₯Ό λμ΄νμμμ€.
- λ³μλ λ κ°μ§ μ νμΌ μ μμ΅λλ€.
- μ§μ λ³μ (λ°μ΄λ λ³μ)
- λΉ κ΅μ λ³μ (μμ λ³μ)
- Fμ μμ λ³μκ° μμΌλ©΄ ν΄λ‘μ κ° λ μ μμ΅λλ€.
- Fμ μμ λ³μ ( F μ μμ λ²μμ μ μ λ )κ°μλ κ²½μ° :
- λλ Fμ λΆλͺ¨ λ²μκ° μμ΄μΌν©λλ€ λ¬΄λ£ λ³μκ° λ°μΈλ©λ©λλ€.
- Fκ° ν΄λΉ μμ λ²μ μΈλΆμμ μ°Έμ‘° λλ©΄ ν΄λΉ μμ λ³μμ λν ν΄λ‘μ κ°λ©λλ€ .
- μ΄ μμ λ³μλ₯Ό ν΄λ‘μ Fμ μμ κ°μ΄λΌκ³ ν©λλ€.
μ΄μ μ΄κ²μ μ¬μ©νμ¬ ν΄λ‘μ λ₯Ό μ¬μ©νλ μ¬λκ³Ό κ·Έλ μ§ μμ μ¬λμ μμ λ΄ μλ€ (μ€λͺ μ μν΄ ν¨μ μ΄λ¦μ μ§μ νμ΅λλ€).
μ¬λ‘ 1 : μΉκ΅¬μ νλ‘κ·Έλ¨
for (var i = 0; i < 10; i++) {
(function f() {
var i2 = i;
setTimeout(function g() {
console.log(i2);
}, 1000);
})();
}
μμ νλ‘κ·Έλ¨μμμ΄ λ κ°μ§ κΈ°λ₯μ λ€μκ³Ό κ°μ΅λλ€ fλ° g. κ·Έλ€μ΄ νμμΈμ§ 보μ.
μ κ²½μ° f:
- λ³μλ₯Ό λμ΄νμμμ€.
i2Aλ λ‘컬 λ³μ.iAλ λ¬΄λ£ λ³μ.setTimeoutAλ λ¬΄λ£ λ³μ.gAλ λ‘컬 λ³μ.consoleAλ λ¬΄λ£ λ³μ.
- κ° μμ λ³μκ° λ°μΈλ© λ μμ λ²μλ₯Ό μ°ΎμΌμμμ€.
iλλ λ°μΈλ© μ μμ.setTimeoutλλ λ°μΈλ© μ μμ.consoleλλ λ°μΈλ© μ μμ.
- μ΄λ€ λ²μμμ ν¨μκ° μ°Έμ‘° λ©λκΉ? μ μ λ²μ .
- λ°λΌμ μ μν΄ νμ
iλμ§ μμ΅λλ€ .f - λ°λΌμ μ μν΄ νμ
setTimeoutλμ§ μμ΅λλ€ .f - λ°λΌμ μ μν΄ νμ
consoleλμ§ μμ΅λλ€ .f
- λ°λΌμ μ μν΄ νμ
λ°λΌμ κΈ°λ₯ fμ νμκ° μλλλ€.
μ κ²½μ° g:
- λ³μλ₯Ό λμ΄νμμμ€.
consoleAλ λ¬΄λ£ λ³μ.i2Aλ λ¬΄λ£ λ³μ.
- κ° μμ λ³μκ° λ°μΈλ© λ μμ λ²μλ₯Ό μ°ΎμΌμμμ€.
consoleλλ λ°μΈλ© μ μμ.i2λλ λ°μΈλ© μ λ²μμf.
- μ΄λ€ λ²μμμ ν¨μκ° μ°Έμ‘° λ©λκΉ? μ λ²μ
setTimeout.- λ°λΌμ μ μν΄ νμ
consoleλμ§ μμ΅λλ€ .g - κ·Έλ¬λ―λ‘
i2λμ΄ λ«ν μν΄g.
- λ°λΌμ μ μν΄ νμ
λ°λΌμ ν¨μλ gμμ λ³μμ λν νμμ
λλ€ i2(λν upvalueμ΄λ€ g) κ²½μ° κ°μμ΄ μ°Έμ‘° λ΄μμκ° setTimeout.
λΉμ μκ² λμ μ : μΉκ΅¬κ° νμλ₯Ό μ¬μ©νκ³ μμ΅λλ€. λ΄λΆ κΈ°λ₯μ νμμ λλ€.
μ¬λ‘ 2 : νλ‘κ·Έλ¨
for (var i = 0; i < 10; i++) {
setTimeout((function f(i2) {
return function g() {
console.log(i2);
};
})(i), 1000);
}
μμ νλ‘κ·Έλ¨μμμ΄ λ κ°μ§ κΈ°λ₯μ λ€μκ³Ό κ°μ΅λλ€ fλ° g. κ·Έλ€μ΄ νμμΈμ§ 보μ.
μ κ²½μ° f:
- λ³μλ₯Ό λμ΄νμμμ€.
i2Aλ λ‘컬 λ³μ.gAλ λ‘컬 λ³μ.consoleAλ λ¬΄λ£ λ³μ.
- κ° μμ λ³μκ° λ°μΈλ© λ μμ λ²μλ₯Ό μ°ΎμΌμμμ€.
consoleλλ λ°μΈλ© μ μμ.
- μ΄λ€ λ²μμμ ν¨μκ° μ°Έμ‘° λ©λκΉ? μ μ λ²μ .
- λ°λΌμ μ μν΄ νμ
consoleλμ§ μμ΅λλ€ .f
- λ°λΌμ μ μν΄ νμ
λ°λΌμ κΈ°λ₯ fμ νμκ° μλλλ€.
μ κ²½μ° g:
- λ³μλ₯Ό λμ΄νμμμ€.
consoleAλ λ¬΄λ£ λ³μ.i2Aλ λ¬΄λ£ λ³μ.
- κ° μμ λ³μκ° λ°μΈλ© λ μμ λ²μλ₯Ό μ°ΎμΌμμμ€.
consoleλλ λ°μΈλ© μ μμ.i2λλ λ°μΈλ© μ λ²μμf.
- μ΄λ€ λ²μμμ ν¨μκ° μ°Έμ‘° λ©λκΉ? μ λ²μ
setTimeout.- λ°λΌμ μ μν΄ νμ
consoleλμ§ μμ΅λλ€ .g - κ·Έλ¬λ―λ‘
i2λμ΄ λ«ν μν΄g.
- λ°λΌμ μ μν΄ νμ
λ°λΌμ ν¨μλ gμμ λ³μμ λν νμμ
λλ€ i2(λν upvalueμ΄λ€ g) κ²½μ° κ°μμ΄ μ°Έμ‘° λ΄μμκ° setTimeout.
λΉμ μ μν΄ μ’μ : λΉμ μ νμλ₯Ό μ¬μ©νκ³ μμ΅λλ€. λ΄λΆ κΈ°λ₯μ νμμ λλ€.
κ·Έλμ λΉμ κ³Ό λΉμ μ μΉκ΅¬ λͺ¨λ νμλ₯Ό μ¬μ©νκ³ μμ΅λλ€. λ§λ€νΌμ λ©μΆμμμ€. ν΄λ‘μ μ κ°λ κ³Ό λ μ¬λ λͺ¨λλ₯Ό μλ³νλ λ°©λ²μ λͺ ννκ² μ 리νμΌλ©΄ν©λλ€.
νΈμ§ : λͺ¨λ ν¨μκ° μ νμλλμ§μ λν κ°λ¨ν μ€λͺ (ν¬λ λ§ @ νΌν°) :
λ¨Όμ λ€μ νλ‘κ·Έλ¨μ κ³ λ €ν΄ λ΄ μλ€ ( μ μ΄μ λλ€ ).
lexicalScope();
function lexicalScope() {
var message = "This is the control. You should be able to see this message being alerted.";
regularFunction();
function regularFunction() {
alert(eval("message"));
}
}
- μ°λ¦¬λ λͺ¨λ μκ³
lexicalScopeλ°regularFunctionνμνμ§ μμ΅λλ€ μμ μ μμμ . - νλ‘κ·Έλ¨μ μ€νν λ ν΄λ‘μ κ° μλκΈ° λλ¬Έμ κ²½κ³ λ₯Όλ°μ κ²μΌλ‘ μμ
messageλ©λλ€ (μ : λΆλͺ¨ λ²μμ λͺ¨λ λ³μμ μ‘μΈμ€ ν μ μμ ).regularFunctionmessage - μ°λ¦¬κ° νλ‘κ·Έλ¨μ μ€νν λ μ€μ λ‘ κ²½κ³ λλ κ²μ κ΄μ°° ν©λλ€
message.
λ€μ νλ‘κ·Έλ¨μ κ³ λ €ν΄ λ΄ μλ€ ( λμμ λλ€ ).
var closureFunction = lexicalScope();
closureFunction();
function lexicalScope() {
var message = "This is the alternative. If you see this message being alerted then in means that every function in JavaScript is a closure.";
return function closureFunction() {
alert(eval("message"));
};
}
- μ°λ¦¬λ λ¨μ§ μμ μ μμμ
closureFunctionνμ λ κ²μμ μκ³ μμ΅λλ€. - μ°λ¦¬κ° νλ‘κ·Έλ¨μ μ€ννλ©΄ μ°λ¦¬λ κΈ°λ
messageκ²½κ³ λ₯Ό ν μ μμ΅λλ€ λλ¬ΈμclosureFunction(μ¦, κ·Έκ²μ λ¨μ§ λͺ¨λ μ μ‘μΈμ€ ν μμλ νμμ λλ€ λΉ μ§μ λ³μ μ ν¨μκ° μμ± λ λ ( μ΄ λ΅λ³μ μ°Έμ‘° -μ΄ ν¬ν¨λμ§ μμ΅λλ€μ΄)message). - νλ‘κ·Έλ¨μ μ€νν λ μ€μ λ‘ κ²½κ³ νκ³ μμ μ κ΄μ°° ν©λλ€
message.
μ°λ¦¬λ μ΄κ²μΌλ‘λΆν° 무μμ μΆλ‘ ν©λκΉ?
- JavaScript μΈν°ν리ν°λ ν΄λ‘μ λ₯Ό λ€λ₯Έ ν¨μλ₯Ό μ²λ¦¬νλ λ°©μκ³Ό λ€λ₯΄κ² μ·¨κΈνμ§ μμ΅λλ€.
- λͺ¨λ κΈ°λ₯μλ μ€μ½ν μ²΄μΈ μ΄ ν¬ν¨λ©λλ€. ν΄λ‘μ μλ λ³λμ μ°Έμ‘° νκ²½ μ΄ μμ΅λλ€ .
- ν΄λ‘μ λ λ€λ₯Έ λͺ¨λ κΈ°λ₯κ³Ό κ°μ΅λλ€. μ°λ¦¬λ κ·Έκ²λ€μ΄ κ·Έλ€μ΄ μν λ²μ λ°μ λ²μμμ μ°Έμ‘° λ λ κ·Έκ²λ€μ ν΄λ‘μ λΌκ³ λΆλ¦ λλ€ . μ΄κ²μ ν₯λ―Έλ‘μ΄ κ²½μ° μ΄κΈ° λλ¬Έ μ λλ€.
λ΅λ³
closureμ μ μ λ°λ₯΄λ©΄ :
βν΄λ‘μ βλ λ³μ λ₯Ό λ¬Άλ νκ²½ (ννμ βλ«λβ) κ³Ό ν¨κ» μμ λ³μλ₯Ό κ°μ§ μ μλ ννμ (μΌλ°μ μΌλ‘ ν¨μ)μ λλ€ .
λΉμ μ΄ μ¬μ©νλ closureλΉμ μ ν¨μμ μΈλΆμμ μ μ λ λ³μλ₯Ό μ¬μ©νλ ν¨μλ₯Ό μ μν©λλ€. (μ°λ¦¬λ λ³μλ₯Ό μμ λ³μ λΌκ³ λΆλ¦
λλ€ ).
κ·Έλ€μ λͺ¨λ μ¬μ©ν©λλ€ closure(첫 λ²μ§Έ μμμλ).
λ΅λ³
κ°λ¨ν λ§ν΄μ μλ° μ€ν¬λ¦½νΈ ν΄λ‘μ λ‘ κΈ°λ₯ ν μ μ‘μΈμ€λ₯Ό κ°λ³ λλ μ΄ν β λΆλͺ¨ ν¨μμμ μ μΈμ .
λ μμΈν μ€λͺ μ 보μ. ν΄λ‘μ λ₯Ό μ΄ν΄νλ €λ©΄ JavaScriptμ λ³μ λ²μλ₯Ό μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
λ²μ
JavaScript λ²μλ ν¨μλ‘ μ μλ©λλ€. λͺ¨λ ν¨μλ μλ‘μ΄ λ²μλ₯Ό μ μν©λλ€.
λ€μ μμ λ₯Ό κ³ λ €νμμμ€.
function f()
{//begin of scope f
var foo='hello'; //foo is declared in scope f
for(var i=0;i<2;i++){//i is declared in scope f
//the for loop is not a function, therefore we are still in scope f
var bar = 'Am I accessible?';//bar is declared in scope f
console.log(foo);
}
console.log(i);
console.log(bar);
}//end of scope f
f μΈμλ₯Ό νΈμΆ
hello
hello
2
Am I Accessible?
μ΄μ gλ€λ₯Έ ν¨μ λ΄μ μ μ λ ν¨μκ°μλ κ²½μ°λ₯Ό κ³ λ €ν΄ λ΄
μλ€ f.
function f()
{//begin of scope f
function g()
{//being of scope g
/*...*/
}//end of scope g
/*...*/
}//end of scope f
fμ μ΄ν λΆλͺ¨ λ₯Ό νΈμΆ ν©λλ€ g. μμμ μ€λͺ
νλ―μ΄ μ΄μ μ°λ¦¬λ λ κ°μ§ λ²μλ₯Ό κ°μ΅λλ€. λ²μ fμ λ²μg .
κ·Έλ¬λ ν λ²μλ λ€λ₯Έ λ²μ λ΄μ βλ΄βμμΌλ©°, νμ ν¨μμ λ²μλ λΆλͺ¨ ν¨μ λ²μμ μΌλΆμ λκΉ? λΆλͺ¨ ν¨μμ λ²μμμ μ μΈ λ λ³μλ μ΄λ»κ²λ©λκΉ? νμ κΈ°λ₯μ λ²μμμ μ‘μΈμ€ ν μ μμ΅λκΉ? λ°λ‘ νμκ° μμλλ κ³³μ λλ€.
νμ
JavaScriptμμ ν¨μ gλ λ²μμ μ μΈ λ λ³μ gλΏλ§ μλλΌ μμ ν¨μ λ²μμ μ μΈ λ λ³μμλ μ‘μΈμ€ ν μ μμ΅λλ€.f .
λ€μμ κ³ λ €νμμμ€.
function f()//lexical parent function
{//begin of scope f
var foo='hello'; //foo declared in scope f
function g()
{//being of scope g
var bar='bla'; //bar declared in scope g
console.log(foo);
}//end of scope g
g();
console.log(bar);
}//end of scope f
f μΈμλ₯Ό νΈμΆ
hello
undefined
λΌμΈμ 보μ console.log(foo);. μ΄ μμ μμ μ°λ¦¬λ λ²μ λ΄μ μμΌλ©° scope μ μ μΈ λ gλ³μμ μ‘μΈμ€νλ €κ³ ν©λλ€ . κ·Έλ¬λ μμμ μΈκΈνλ―μ΄ μ¬κΈ°μλ μ΄ν λΆλͺ¨ ν¨μμ μ μΈ λ λ³μμ μ‘μΈμ€ ν μ μμ΅λλ€. μ μ΄ν λΆλͺ¨μ
λλ€ . λ°λΌμ μΈμλ©λλ€.
μ΄μ λΌμΈμ 보μ . μ΄ μμ μμ μ°λ¦¬λ λ²μ λ΄μ μμΌλ©° scope μ μ μΈ λ λ³μμ μ‘μΈμ€νλ €κ³ ν©λλ€ . νμ¬ λ²μμμ μ μΈλμ§ μμμΌλ©° ν¨μ κ°μ λΆλͺ¨κ° μλλ― λ‘ μ μλμ§ μμμ΅λλ€.foofgfhelloconsole.log(bar);fbargbargfbar
μ€μ λ‘ μ°λ¦¬λ μ΄ν βgrand parentβν¨μμ λ²μμμ μ μΈ λ λ³μμ μ‘μΈμ€ ν μλ μμ΅λλ€. λ°λΌμ ν¨μ hλ΄μ μ μ λ ν¨μκ° μλ€λ©΄g
function f()
{//begin of scope f
function g()
{//being of scope g
function h()
{//being of scope h
/*...*/
}//end of scope h
/*...*/
}//end of scope g
/*...*/
}//end of scope f
λ€μ hν¨μμ λ²μμ μ μΈ λ λͺ¨λ λ³μμ μ‘μΈμ€ ν μμμ κ² h, gλ±μ f. μ΄κ²μ ν΄λ‘μ λ‘ μ΄λ£¨μ΄μ§λλ€ . JavaScript ν΄λ‘μ μμλ μ΄ν λΆλͺ¨ ν¨μ, μ΄ν κ·Έλλ λΆλͺ¨ ν¨μ, μ΄ν κ·Έλλ λΆλͺ¨ ν¨μ λ±μμ μ μΈ λ λͺ¨λ λ³μμ μ‘μΈμ€ ν μ μμ΅λλ€. μ΄λ λ²μ μ²΄μΈ μΌλ‘ λ³Ό μ μμ΅λλ€ . scope of current function -> scope of lexical parent function -> scope of lexical grand parent function -> ... μ΄ν λΆλͺ¨κ°μλ λ§μ§λ§ λΆλͺ¨ ν¨μκΉμ§
μλμ° κ°μ²΄
μ€μ λ‘ μ²΄μΈμ λ§μ§λ§ λΆλͺ¨ ν¨μμμ λ©μΆμ§ μμ΅λλ€. νΉλ³ν λ²μκ° νλ λ μμ΅λλ€. μ μ λ²μ . ν¨μμμ μ μΈλμ§ μμ λͺ¨λ λ³μλ μ μ λ²μμμ μ μΈ λ κ²μΌλ‘ κ°μ£Όλ©λλ€. κΈλ‘λ² μ€μ½νμλ λ κ°μ§ νΉμ±μ΄ μμ΅λλ€.
- μ μ λ²μμμ μ μΈ λ λͺ¨λ λ³μλ λͺ¨λ κ³³μμ μ‘μΈμ€ κ°λ₯
- μ μ λ²μμμ μ μΈ λ λ³μλ
windowκ°μ²΄ μ μμ±μ ν΄λΉ ν©λλ€.
λ°λΌμ fooμ μ λ²μμμ λ³μλ₯Ό μ μΈνλ λ κ°μ§ λ°©λ²μ΄ μμ΅λλ€ . ν¨μμμ μ μΈνμ§ μκ±°λ fooμλμ° κ°μ²΄ μ μμ± μ μ€μ νμ¬ .
λ μλ λͺ¨λ ν΄λ‘μ λ₯Ό μ¬μ©ν©λλ€.
λ μμΈν μ€λͺ μ μ½μμΌλ―λ‘ μ΄μ λ μ루μ λͺ¨λ ν΄λ‘μ λ₯Ό μ¬μ©νλ κ²μ΄ λΆλͺ ν μ μμ΅λλ€. κ·Έλ¬λ νμ€νκ² μ¦κ±°λ₯Ό λ§λ€μ΄ λ΄ μλ€.
μλ‘μ΄ νλ‘κ·Έλλ° μΈμ΄λ₯Ό λ§λ€μ΄ 보μ. JavaScript-No-Closure. μ΄λ¦μμ μ μ μλ―μ΄ JavaScript-No-Closureλ ν΄λ‘μ λ₯Ό μ§μνμ§ μλλ€λ μ μ μ μΈνλ©΄ JavaScriptμ λμΌν©λλ€.
λ€μ λ§ν΄;
var foo = 'hello';
function f(){console.log(foo)};
f();
//JavaScript-No-Closure prints undefined
//JavaSript prints hello
μ, JavaScript-No-Closureλ₯Ό μ¬μ©νλ 첫 λ²μ§Έ μ루μ μμ μ΄λ€ μΌμ΄ λ°μνλμ§ λ΄ μλ€.
for(var i = 0; i < 10; i++) {
(function(){
var i2 = i;
setTimeout(function(){
console.log(i2); //i2 is undefined in JavaScript-No-Closure
}, 1000)
})();
}
λ°λΌμ μ΄κ²μ μΈμλ©λλ€ undefined JavaScript-No-Closureμμ 10 λ² .
λ°λΌμ 첫 λ²μ§Έ μ루μ μ ν΄λ‘μ λ₯Ό μ¬μ©ν©λλ€.
λ λ²μ§Έ ν΄κ²°μ± μ 보μ.
for(var i = 0; i < 10; i++) {
setTimeout((function(i2){
return function() {
console.log(i2); //i2 is undefined in JavaScript-No-Closure
}
})(i), 1000);
}
λ°λΌμ μ΄κ²μ μΈμλ©λλ€ undefined JavaScript-No-Closureμμ 10 λ² .
λ μ루μ λͺ¨λ ν΄λ‘μ λ₯Ό μ¬μ©ν©λλ€.
νΈμ§ :μ΄ 3 κ°μ μ½λ μ€ λν«μ΄ μ μ λ²μμ μ μλμ΄ μμ§ μμ κ²μΌλ‘ κ°μ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ λ³μ fooμ κ°μ²΄κ° κ°μ²΄μ iλ°μΈλ© windowλλ―λ‘ windowJavaScriptμ JavaScript-No-Closure μ κ°μ²΄λ₯Ό ν΅ν΄ μ‘μΈμ€ ν μ μμ΅λλ€ .
λ΅λ³
λλ λκ΅°κ°κ° μ΄κ²μ μ€λͺ νλ λ°©μμ κ²°μ½ ν볡νμ§ μμμ΅λλ€.
ν΄λ‘μ λ₯Ό μ΄ν΄νλ μ΄μ λ ν΄λ‘μ κ°μλ JSμ λͺ¨μ΅μ μ΄ν΄νλ κ²μ λλ€.
ν΄λ‘μ κ° μμΌλ©΄ μ€λ₯κ° λ°μν©λλ€.
function outerFunc(){
var outerVar = 'an outerFunc var';
return function(){
alert(outerVar);
}
}
outerFunc()(); //returns inner function and fires it
outerFuncκ° κ°μμ ν΄λ‘μ λΉνμ±ν λ²μ μ JavaScriptλ‘ λ°νλλ©΄ outerVarμ λν μ°Έμ‘°λ κ°λΉμ§ μμ§λμ΄ λ΄λΆ ν¨μκ° μ°Έμ‘° ν μμλ λΆλΆμ΄ μμ΄μ§λλ€.
ν΄λ‘μ λ λ³Έμ§μ μΌλ‘ λ΄λΆ ν¨μκ° μΈλΆ ν¨μμ λ³μλ₯Ό μ°Έμ‘° ν λ ν΄λΉ λ³μκ° μ‘΄μ¬ν μ μλλ‘νλ νΉμ κ·μΉμ λλ€. ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ μΈλΆ ν¨μκ° μνλκ±°λ ν¬μΈνΈλ₯Ό κΈ°μ΅νλ λ° λμμ΄λλ κ²½μ° βλ«νβνμλ μ°Έμ‘° λ varκ° μ μ§λ©λλ€.
ν΄λ‘μ λ₯Ό μ¬μ©νλλΌλ λ‘컬μ μ°Έμ‘°νλ λ΄λΆ νν¬κ°μλ ν¨μμμ λ‘컬 varμ μλͺ μ£ΌκΈ°λ ν΄λ‘μ λ¦¬μ€ λ²μ μμμ λμΌνκ² μλν©λλ€. ν¨μκ° μλ£λλ©΄ μ§μ μ£Όλ―Όμ κ°λΉμ§ μμ§μλ°μ΅λλ€.
λ΄λΆ νν¬μμ μΈλΆ varμ λν μ°Έμ‘°κ° μμΌλ©΄ λμ΄ μΌμ΄ μ°Έμ‘° varμ λν κ°λΉμ§ μμ§ λ°©μκ³Ό μ μ¬ν©λλ€.
ν΄λ‘μ λ₯Ό 보λ λ μ νν λ°©λ²μ λ΄λΆ ν¨μκ° κΈ°λ³Έμ μΌλ‘ λ΄λΆ λ²μλ₯Ό μ체 λ²μ μλ¦¬λ‘ μ¬μ©νλ€λ κ²μ λλ€.
κ·Έλ¬λ μ°Έμ‘° λ 컨ν μ€νΈλ μ¬μ€ μ€λ μ·κ³Όλ λ¬λ¦¬ μꡬμ μ λλ€. μΈλΆ ν¨μμ λ‘컬 λ³μλ₯Ό κ³μ μ¦κ°μν€κ³ λ‘κΉ νλ λ°ν λ λ΄λΆ ν¨μλ₯Ό λ°λ³΅μ μΌλ‘ μ€ννλ©΄ λ λμ κ°μ κ²½κ³ ν©λλ€.
function outerFunc(){
var incrementMe = 0;
return function(){ incrementMe++; console.log(incrementMe); }
}
var inc = outerFunc();
inc(); //logs 1
inc(); //logs 2
λ΅λ³
λ λ€ ν΄λ‘μ λ₯Ό μ¬μ©νκ³ μμ΅λλ€.
λλ μ¬κΈ° Wikipedia μ μ μ ν¨κ» κ° κ²μ΄λ€.
μ»΄ν¨ν° κ³Όνμμ ν΄λ‘μ (μ΄ν νμ λλ ν¨μ ν΄λ‘μ )λ μ°Έμ‘° νκ²½κ³Ό ν¨κ» ν¨μμ λν ν¨μ λλ μ°Έμ‘°μ λλ€. ν΄λΉ ν¨μμ λ‘컬 λ³μκ° μλ κ° λ³μ (μμ λ³μλΌκ³ λ ν¨)μ λν μ°Έμ‘°λ₯Ό μ μ₯νλ ν μ΄λΈ . μΌλ° ν¨μ ν¬μΈν°μ λ¬λ¦¬ ν΄λ‘μ λ ν¨μκ° μ¦κ°μ μΈ μ΄ν λ²μλ₯Ό λ²μ΄λ κ²½μ°μλ λ‘μ»¬μ΄ μλ λ³μμ μ‘μΈμ€ ν μ μλλ‘ν©λλ€.
μΉκ΅¬μ μλ iλ κ°μ κ°μ Έ μμ λ‘컬μ μ μ₯ν μ¬λ³Έμ λ§λ€μ΄ λ‘μ»¬μ΄ μλ λ³μλ₯Ό λͺ
ννκ² μ¬μ©ν©λλ€ i2.
μμ μ μλλ i(μ½ μ¬μ΄νΈμ λ²μμμλ) μ΅λͺ
ν¨μμ μΈμλ‘ μ λ¬ν©λλ€. μ΄κ²μ μ§κΈκΉμ§μ ν΄λ‘μ κ° μλμ§λ§ ν΄λΉ ν¨μλ λμΌνλ₯Ό μ°Έμ‘°νλ λ€λ₯Έ ν¨μλ₯Ό λ°νν©λλ€ i2. λ΄λΆ μ΅λͺ
ν¨μ λ΄λΆ i2λ λ‘μ»¬μ΄ μλλ―λ‘ ν΄λ‘μ κ° μμ±λ©λλ€.
λ΅λ³
λΉμ κ³Ό λΉμ μ μΉκ΅¬λ λͺ¨λ νμλ₯Ό μ¬μ©ν©λλ€ :
ν΄λ‘μ λ ν¨μμ ν΄λΉ ν¨μκ° μμ±λ νκ²½μ λ κ°μ§λ₯Ό κ²°ν©ν νΉλ³ν μ’ λ₯μ κ°μ²΄μ λλ€. νκ²½μ ν΄λ‘μ κ° μμ± λ λ λ²μ λ΄μ μλ λ‘컬 λ³μλ‘ κ΅¬μ±λ©λλ€.
MDN : https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures
function(){ console.log(i2); }μ΅λͺ
ν¨μμ νμ λ΄λΆμ μ μ λ μΉκ΅¬μ μ½λ ν¨μμμ function(){ var i2 = i; ...λ‘컬 λ³μλ₯Ό μ½κ³ μΈ μ μμ΅λλ€ i2.
μ½λ ν¨μμμ ν¨μ function(){ console.log(i2); }νμ λ΄λΆμ μ μλμ΄ function(i2){ return ...μμΌλ©° λ‘컬 κ°μΉλ₯Ό μ½κ±°λ μΈ μ μμ΅λλ€ i2(μ΄ κ²½μ° λ§€κ° λ³μλ‘ μ μΈ).
λ κ²½μ° λͺ¨λ ν¨μλ function(){ console.log(i2); }λ‘ μ λ¬λ©λλ€ setTimeout.
λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ μ λ€λ₯Έ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
function fGenerator(i2){
return function(){
console.log(i2);
}
}
for(var i = 0; i < 10; i++) {
setTimeout(fGenerator(i), 1000);
}
λ΅λ³
νμ
ν΄λ‘μ λ ν¨μκ° μλλ©° ννμμ΄ μλλλ€. ν¨μ μ€μ½ν μΈλΆμμ μ¬μ© λ λ³μμ ν¨μ λ΄λΆμμ μ¬μ©λλ μΌμ’ μ βμ€λ μ·βμΌλ‘ νμλμ΄μΌν©λλ€. λ¬Έλ²μ μΌλ‘, βλ³μλ₯Ό λ«μ΅λλ€βλΌκ³ λ§ν΄μΌν©λλ€.
λ€μ λ§νλ©΄, ν΄λ‘μ λ ν¨μκ° μμ‘΄νλ κ΄λ ¨ λ³μ 컨ν μ€νΈμ 볡μ¬λ³Έμ λλ€.
ν λ² λ (naΓ―f) : ν΄λ‘μ κ° λ§€κ° λ³μλ‘ μ λ¬λμ§ μμ λ³μμ μ‘μΈμ€ ν μ μμ΅λλ€.
μ΄ κΈ°λ₯ κ°λ μ μ¬μ©νλ νλ‘κ·Έλλ° μΈμ΄ / νκ²½μ λ°λΌ ν¬κ² λ¬λΌμ§λλ€. JavaScriptμμ ν΄λ‘μ λ μ΄ν λ²μ (λλΆλΆμ c μΈμ΄μμ μ μ©λ¨)μ μμ‘΄ν©λλ€.
λ°λΌμ ν¨μλ₯Ό λ°ννλ κ²μ λλΆλΆ μ΅λͺ / λͺ λͺ λμ§ μμ ν¨μλ₯Ό λ°νν©λλ€. ν¨μκ° λ³μλ‘ μ‘μΈμ€νμ§ μκ³ λ§€κ° λ³μλ‘ μ λ¬λμ§ μκ³ (μ΄ν) λ²μ λ΄μμ ν΄λ‘μ κ° λ°μνμ΅λλ€.
λ°λΌμ κ·νμ μμ κ΄λ ¨νμ¬ :
// 1
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // closure, only when loop finishes within 1000 ms,
}, 1000); // i = 10 for all functions
}
// 2
for(var i = 0; i < 10; i++) {
(function(){
var i2 = i; // closure of i (lexical scope: for-loop)
setTimeout(function(){
console.log(i2); // closure of i2 (lexical scope:outer function)
}, 1000)
})();
}
// 3
for(var i = 0; i < 10; i++) {
setTimeout((function(i2){
return function() {
console.log(i2); // closure of i2 (outer scope)
}
})(i), 1000); // param access i (no closure)
}
λͺ¨λ νμλ₯Ό μ¬μ©νκ³ μμ΅λλ€. μ€ν μ§μ κ³Ό ν΄λ‘μ λ₯Ό νΌλνμ§ λ§μμμ€. ν΄λ‘μ μ βμ€λ μ·βμ μλͺ»λ μκ°μ κ°μ Έ μ€λ©΄ κ°μ΄ μμμΉ λͺ»ν κ²μΌ μ μμ§λ§ νμ€ν ν΄λ‘μ κ° λ°μν©λλ€!