ìë°ì¤í¬ë¦½í¸ë í¨ì ì§í¥ ì¸ì´ì ëë¤. ì´ë° í¹ì§ì ê°ë°ììê² ë§ì ìì 를 ì¤ëë¤. í¨ì를 ëì ì¼ë¡ ìì±í ì ìê³ , ìì±í í¨ì를 ë¤ë¥¸ í¨ìì ì¸ìë¡ ë길 ì ìì¼ë©°, ìì±ë ê³³ì´ ìë ê³³ìì í¨ì를 í¸ì¶í ìë ì기 ë문ì ëë¤.
í¨ì ë´ë¶ìì í¨ì ì¸ë¶ì ìë ë³ìì ì ê·¼í ì ìë¤ë ì¬ì¤ì ìì íìµí´ì ìê³ ê³ì¤ ê²ëë¤.
ê·¸ë°ë° í¨ìê° ìì±ë ì´íì ì¸ë¶ ë³ìê° ë³ê²½ëë©´ ì´ë¤ ì¼ì´ ë°ìí ê¹ì? í¨ìë ìë¡ì´ ê°ì ê°ì ¸ì¬ê¹ì? ìëë©´ ìì± ìì ì´ì ì ê°ì ê°ì ¸ì¬ê¹ì?
매ê°ë³ì를 íµí´ í¨ì를 ëê¸°ê³ ì´ í¨ì를 ì ë©ë¦¬ ë¨ì´ì§ ì½ëìì í¸ì¶í ë ì´ë¤ ì¼ì´ ë°ìí ê¹ì? í¨ìë í¸ì¶ëë ê³³ì 기ì¤ì¼ë¡ ì¸ë¶ ë³ìì ì ê·¼í ê¹ì?
ì´ì ì´ë° ê°ë¨í ìë리ì¤ë¶í° ììí´ ì¢ ë ë³µì¡í ìë리ì¤ë¥¼ ë¤ë£° ì ìëë¡ ì§ìì íì¥í´ ë´ ìë¤.
let, constë¡ ì ì¸í ë³ìë§ ë¤ë£¹ëë¤.ìë°ì¤í¬ë¦½í¸ììë 3ê°ì í¤ìë를 ì¬ì©í´ ë³ì를 ì ì¸í ì ììµëë¤. 모ëí ë°©ìì¸ let, constê° ìê³ , 과거ì ìì¬ì¸ varë ììµëë¤.
- ì´ë² 주ì ì 모ë ìììì
letì¼ë¡ ì ì¸í ë³ì를 ì¬ì©í ìì ì ëë¤. constë¡ ì ì¸í ë³ì ììletë³ìì ëì¼íê² ëìí©ëë¤. ë°ë¼ì ìììletìconstë¡ ë°ê¿ë ëì¼í ëìì 기ëí ì ììµëë¤.varëletê³¼constë¡ ì ì¸í ë³ìì ëª ê°ì§ ì¤ìí ì°¨ì´ê° ììµëë¤. ìì¸í ë´ì©ì ì¤ëë varìì ë¤ë£¨ê² ìµëë¤.
ì½ë ë¸ë¡
ì½ë ë¸ë¡ {...} ììì ì ì¸í ë³ìë ë¸ë¡ ìììë§ ì¬ì©í ì ììµëë¤.
ìì:
{
// ì§ì ë³ì를 ì ì¸íê³ ëª ê°ì§ ì¡°ìì íì§ë§ ê·¸ 결과를 ë°ìì ë³¼ ì ììµëë¤.
let message = "ìë
íì¸ì."; // ë¸ë¡ ë´ììë§ ë³ì«ê°ì ì»ì ì ììµëë¤.
alert(message); // ìë
íì¸ì.
}
alert(message); // ReferenceError: message is not defined
ì´ë° ë¸ë¡ì í¹ì§ì í¹ì ìì ì ìííë ì½ë를 íë° ë¬¶ì´ëë ì©ëë¡ íì©í ì ììµëë¤. ë¸ë¡ ìì ìì ìíìë§ íìí ë³ìê° ë¤ì´ê°ëë¤.
{
// ë©ìì§ ì¶ë ¥
let message = "ìë
íì¸ì.";
alert(message);
}
{
// ë ë¤ë¥¸ ë©ìì§ ì¶ë ¥
let message = "ìë
í ê°ì¸ì.";
alert(message);
}
ì´ë¯¸ ì ì¸ë ë³ìì ëì¼í ì´ë¦ì ê°ì§ ë³ì를 ë³ëì ë¸ë¡ ìì´ letì¼ë¡ ì ì¸íë©´ ìë¬ê° ë°ìí©ëë¤.
// ë©ìì§ ì¶ë ¥
let message = "ìë
íì¸ì.";
alert(message);
// ë ë¤ë¥¸ ë©ìì§ ì¶ë ¥
let message = "ìë
í ê°ì¸ì."; // SyntaxError: Identifier 'message' has already been declared
alert(message);
if, for, while ë±ììë ë§ì°¬ê°ì§ë¡ {...} ììì ì ì¸í ë³ìë ì¤ì§ ë¸ë¡ ìììë§ ì ê·¼ ê°ë¥í©ëë¤.
if (true) {
let phrase = "ìë
íì¸ì!";
alert(phrase); // ìë
íì¸ì!
}
alert(phrase); // ReferenceError: phrase is not defined
if ë¸ë¡ ë°ì ìë alertë phraseì ì ê·¼í ì ì기 ë문ì ì ìì를 ì¤ííë©´ ìë¬ê° ë°ìí©ëë¤.
ì´ë° í¹ì§ì ë³ìì ì í¨ ë²ì를 ë¸ë¡ ë²ì, í¹í if ë¶ê¸°ë¬¸ ë²ìë¡ íì ìí¬ ì ìì´ì ì주 ì ì©í©ëë¤.
if ë¿ë§ ìëë¼ for, while ë°ë³µë¬¸ììë ëì¼í í¹ì§ì´ ì ì©ë©ëë¤.
for (let i = 0; i < 3; i++) {
// ë³ì ië for ìììë§ ì¬ì©í ì ììµëë¤.
alert(i); // 0, 1, 2ê° ì¶ë ¥
}
alert(i); // ReferenceError: i is not defined
ì°¸ê³ ë¡ for문ìì for ì ê´í¸ ììì ì ì¸í ë³ì(ìììì let i)ë {...} ë°ì ì긴 íì§ë§ ë¸ë¡ {...}ì ìíë ì½ëë¡ ì·¨ê¸ë©ëë¤.
ì¤ì²© í¨ì
í¨ì ë´ë¶ìì ì ì¸í í¨ìë âì¤ì²©(nested)â í¨ìë¼ê³ ë¶ë¦ ëë¤.
ìë°ì¤í¬ë¦½í¸ìì ìì½ê² ì¤ì²© í¨ì를 ë§ë¤ ì ììµëë¤.
ì¤ì²© í¨ìë ìëì ê°ì´ ì½ë를 ì ëíëë° ì¬ì©í ì ììµëë¤.
function sayHiBye(firstName, lastName) {
// í¬í¼(helper) ì¤ì²© í¨ì
function getFullName() {
return firstName + " " + lastName;
}
alert( "Hello, " + getFullName() );
alert( "Bye, " + getFullName() );
}
ì ìììì ì¸ë¶ ë³ìì ì ê·¼í´ ì´ë¦ ì 체를 ë°íí´ì£¼ë ì¤ì²© í¨ì getFullName()ì í¸ìì ë§ë í¨ìì
ëë¤. ì´ë ê² ìë°ì¤í¬ë¦½í¸ìì ì¤ì²© í¨ìê° íí ì¬ì©ë©ëë¤.
ì¤ì²© í¨ìë ìë¡ì´ ê°ì²´ì íë¡í¼í° ííë ì¤ì²© í¨ì ê·¸ ìì²´ë¡ ë°íë ì ìë¤ë ì ìì í¥ë¯¸ë¡ìµëë¤. ì´ë ê² ë°íë ì¤ì²© í¨ìë ì´ëìë í¸ì¶í´ ì¬ì©í ì ììµëë¤. ë¬¼ë¡ ì´ëë ì¸ë¶ ë³ìì ì ê·¼í ì ìë¤ë ì¬ì¤ì ë³í¨ììµëë¤.
ìë í¨ì makeCounterë í¸ì¶ë ëë§ë¤ ë¤ì ì«ì를 ë°íí´ì£¼ë âì¹´ì´í°â í¨ì를 ë§ëëë¤.
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1
alert( counter() ); // 2
ììì makeCounterë ì주 ë¨ìíì§ë§, ì¬ê¸°ì ì½ê°ì ë³íì ê°íë©´ ëì ìì±ê¸° ê°ì ì¤ì©ì± ìë í¨ì를 ë§ë¤ ì ììµëë¤.
ê·¸ë°ë° makeCounter를 ì´í´ë³´ë¤ ë³´ë©´ âcounter를 ì¬ë¬ ê° ë§ë¤ìì ë, ì´ í¨ìë¤ì ìë¡ ë
립ì ì¼ê¹? í¨ìì ì¤ì²© í¨ì ë´ count ë³ìì ì´ë¤ ê°ì´ í ë¹ë ê¹?â ê°ì ìë¬¸ì´ ë¤ê¸° ë§ë ¨ì
ëë¤.
ì´ë° ì문ì í´ê²°í ì ìê² ëë©´ ìë°ì¤í¬ë¦½í¸ ìë ¨ëê° í¬ê² ì¬ë¼ê°ëë¤. ì¢ ë ë³µì¡í ìë리ì¤ë ë¤ë£° ì ìê² ëì£ . ì, 긴ë§í íì ìì´ ë°ë¡ ììí´ë´ ìë¤.
ë ì컬 íê²½
ìì¼ë¡ ë¤ë£° ë´ì©ì ì´ë µìµëë¤.
ì§ê¸ê¹ì§ ë¡ì° ë 벨 ììì ìµëí í¼íë ë°©ìì¼ë¡ íí 리ì¼ì ì ê°íìµëë¤. íì§ë§ ì¬ê¸°ì ë¤ë£¨ë ë´ì©ì ìì§ ëª»íë©´ ìë°ì¤í¬ë¦½í¸ë¥¼ ìì í ì´í´í ì ììµëë¤. í¸ëì´ êµ´ì ë¤ì´ê° í¸ëì´ë¥¼ ì¡ìë´ ìë¤!
ëª íí ì´í´ë¥¼ ë기 ìí´ ì¤ëª ì ëª ê°ì ë¨ê³ë¡ ëë ì ì§ííê² ìµëë¤.
ë¨ê³ 1. ë³ì
ìë°ì¤í¬ë¦½í¸ìì ì¤í ì¤ì¸ í¨ì, ì½ë ë¸ë¡ {...}, ì¤í¬ë¦½í¸ ì ì²´ë ë ì컬 íê²½(Lexical Environment) ì´ë¼ ë¶ë¦¬ë ë´ë¶ ì¨ê¹ ì°ê´ ê°ì²´(internal hidden associated object)를 ê°ìµëë¤.
ë ì컬 íê²½ ê°ì²´ë ë ë¶ë¶ì¼ë¡ 구ì±ë©ëë¤.
- íê²½ ë ì½ë(Environment Record) â 모ë ì§ì ë³ì를 íë¡í¼í°ë¡ ì ì¥íê³ ìë ê°ì²´ì
ëë¤.
thisê°ê³¼ ê°ì 기í ì ë³´ë ì¬ê¸°ì ì ì¥ë©ëë¤. - ì¸ë¶ ë ì컬 íê²½(Outer Lexical Environment) ì ëí 참조 â ì¸ë¶ ì½ëì ì°ê´ë¨
'ë³ìâë í¹ì ë´ë¶ ê°ì²´ì¸ íê²½ ë ì½ëì íë¡í¼í°ì¼ ë¿ì
ëë¤. 'ë³ì를 ê°ì ¸ì¤ê±°ë ë³ê²½âíë ê²ì 'íê²½ ë ì½ëì íë¡í¼í°ë¥¼ ê°ì ¸ì¤ê±°ë ë³ê²½âí¨ì ì미í©ëë¤.
ìë ë ì¤ì§ë¦¬ ì½ëì ë ì컬 íê²½ì´ íëë§ ì¡´ì¬í©ëë¤.
ì´ë ê² ì¤í¬ë¦½í¸ ì ì²´ì ê´ë ¨ë ë ì컬 íê²½ì ì ì ë ì컬 íê²½(global Lexical Environment)ì´ë¼ê³ í©ëë¤.
ì 그림ìì ë¤ëª¨ ììë ë³ìê° ì ì¥ëë íê²½ ë ì½ë(1)를 ëíë´ê³ ë¤ëª¨ ìì ì, ì¤ë¥¸ìª½ì í¥íë íì´íë ì¸ë¶ ë ì컬 íê²½ì ëí 참조(2)를 ëíë
ëë¤. ì ì ë ì컬 íê²½ì ì¸ë¶ 참조를 ê°ì§ ì기 ë문ì íì´íê° nullì ê°ë¦¬í¤ë 걸 íì¸í ì ììµëë¤.
ì½ëê° ì¤íëê³ ì¤í íë¦ì´ ì´ì´ì ¸ ëê°ë©´ì ë ì컬 íê²½ì ë³íí©ëë¤.
ì¢ ë 긴 ì½ë를 ì´í´ë´ ìë¤.
ì°ì¸¡ì ë¤ëª¨ ììë¤ì ì½ëê° í ì¤, í ì¤ ì¤íë ëë§ë¤ ì ì ë ì컬 íê²½ì´ ì´ë»ê² ë³ííëì§ ë³´ì¬ì¤ëë¤.
- ì¤í¬ë¦½í¸ê° ììëë©´(execution start) ì¤í¬ë¦½í¸ ë´ìì ì ì¸í ë³ì ì ì²´ê° ë ì컬 íê²½ì ì¬ë¼ê°ëë¤(pre-populated).
- ì´ë ë³ìì ìíë í¹ì ë´ë¶ ìí(special internal state)ì¸ 'uninitializedâê° ë©ëë¤. ìë°ì¤í¬ë¦½í¸ ìì§ì uninitialized ìíì ë³ì를 ì¸ì§í긴 íì§ë§,
letì ë§ë기 ì ê¹ì§ ì´ ë³ì를 참조í ì ììµëë¤.
- ì´ë ë³ìì ìíë í¹ì ë´ë¶ ìí(special internal state)ì¸ 'uninitializedâê° ë©ëë¤. ìë°ì¤í¬ë¦½í¸ ìì§ì uninitialized ìíì ë³ì를 ì¸ì§í긴 íì§ë§,
let phraseê° ëíë¬ë¤ì. ìì§ ê°ì í ë¹í기 ì ì´ê¸° ë문ì íë¡í¼í° ê°ìundefinedì ëë¤.phraseë ì´ ìì ì´íë¶í° ì¬ì©í ì ììµëë¤.phraseì ê°ì´ í ë¹ëììµëë¤.phraseì ê°ì´ ë³ê²½ëììµëë¤.
ìì§ê¹ì§ ì´ë ¤ì´ ê² ìì´ ë³´ì´ë¤ì. ì§ê¸ê¹ì§ ë°°ì´ ë´ì©ì ìì½í´ ë´ ìë¤.
- ë³ìë í¹ì ë´ë¶ ê°ì²´ì¸ íê²½ ë ì½ëì íë¡í¼í°ì ëë¤. íê²½ ë ì½ëë íì¬ ì¤í ì¤ì¸ í¨ìì ì½ë ë¸ë¡, ì¤í¬ë¦½í¸ì ì°ê´ëì´ ììµëë¤.
- ë³ì를 ë³ê²½íë©´ íê²½ ë ì½ëì íë¡í¼í°ê° ë³ê²½ë©ëë¤.
'ë ì컬 íê²½âì ëª ì¸ììì ìë°ì¤í¬ë¦½í¸ê° ì´ë»ê² ëìíëì§ ì¤ëª íë ë° ì°ì´ë âì´ë¡ ììâ ê°ì²´ì ëë¤. ë°ë¼ì ì½ë를 ì¬ì©í´ ì§ì ë ì컬 íê²½ì ì»ê±°ë ì¡°ìíë ê²ì ë¶ê°ë¥í©ëë¤.
ìë°ì¤í¬ë¦½í¸ ìì§ë¤ì ëª ì¸ìì ì¸ê¸ë ì¬íì ì¤ìíë©´ì ìì§ ê³ ì ì ë°©ë²ì ì¬ì©í´ ë ì컬 íê²½ì ìµì íí©ëë¤. ì¬ì©íì§ ìë ë³ì를 ë²ë ¤ ë©ëª¨ë¦¬ë¥¼ ì ì½íê±°ë ë¤ìí ë´ë¶ í¸ë¦ì ì¨ì ë§ì´ì£ .
ë¨ê³ 2. í¨ì ì ì¸ë¬¸
í¨ìë ë³ìì ë§ì°¬ê°ì§ë¡ ê°ì ëë¤.
ë¤ë§ í¨ì ì ì¸ë¬¸(function declaration)ì¼ë¡ ì ì¸í í¨ìë ì¼ë° ë³ììë ë¬ë¦¬ ë°ë¡ ì´ê¸°íëë¤ë ì ìì ì°¨ì´ê° ììµëë¤.
í¨ì ì ì¸ë¬¸ì¼ë¡ ì ì¸í í¨ìë ë ì컬 íê²½ì´ ë§ë¤ì´ì§ë ì¦ì ì¬ì©í ì ììµëë¤. ë³ìë letì ë§ë ì ì¸ì´ ë ëê¹ì§ ì¬ì©í ì ìì§ë§ ë§ì´ì£ .
ì ì¸ë기 ì ìë í¨ì를 ì¬ì©í ì ìë ê²ì ë°ë¡ ì´ ë문ì ëë¤.
ìë 그림ì ì¤í¬ë¦½í¸ì í¨ì를 ì¶ê°íì ë ì ì ë ì컬 íê²½ ì´ê¸° ìíê° ì´ë»ê² ë³íëì§ ë³´ì¬ì¤ëë¤.
ì´ë° ëì ë°©ìì í¨ì ì ì¸ë¬¸ì¼ë¡ ì ìí í¨ììë§ ì ì©ë©ëë¤. let say = function(name)...ê°ì´ í¨ì를 ë³ìì í ë¹í í¨ì ííì(function expression)ì í´ë¹íì§ ììµëë¤.
ë¨ê³ 3. ë´ë¶ì ì¸ë¶ ë ì컬 íê²½
í¨ì를 í¸ì¶í´ ì¤ííë©´ ìë¡ì´ ë ì컬 íê²½ì´ ìëì¼ë¡ ë§ë¤ì´ì§ëë¤. ì´ ë ì컬 íê²½ì í¨ì í¸ì¶ ì ë겨ë°ì 매ê°ë³ìì í¨ìì ì§ì ë³ìê° ì ì¥ë©ëë¤.
say("John")ì í¸ì¶íë©´ ìëì ê°ì ë´ë¶ ë³íê° ì¼ì´ë©ëë¤(íì¬ ì¤í íë¦ì í¨ì ë´ë¶, íì´íë¡ íìí ì¤(alert 문)ì ë©ì¶°ìë ìí©ì
ëë¤).
í¨ì í¸ì¶ ì¤ì í¸ì¶ ì¤ì¸ í¨ì를 ìí ë´ë¶ ë ì컬 í경과 ë´ë¶ ë ì컬 íê²½ì´ ê°ë¦¬í¤ë ì¸ë¶ ë ì컬 íê²½, ì´ 2ê°ì ë ì컬 íê²½ì ê°ê² ë©ëë¤.
- ììì ë´ë¶ ë ì컬 íê²½ì íì¬ ì¤í ì¤ì¸ í¨ìì¸
sayì ììí©ëë¤. ë´ë¶ ë ì컬 íê²½ì í¨ìì ì¸ìì¸nameì¼ë¡ë¶í° ì ëí íë¡í¼í° íëë§ ìë¤ì.say("John")ì í¸ì¶í기 ë문ì,nameì ê°ì"John"ì´ ë©ëë¤. - ììì ì¸ë¶ ë ì컬 íê²½ì ì ì ë ì컬 íê²½ì
ëë¤. ì ì ë ì컬 íê²½ì
phraseì í¨ìsay를 íë¡í¼í°ë¡ ê°ìµëë¤.
ê·¸ë¦¬ê³ ë´ë¶ ë ì컬 íê²½ì ì¸ë¶ ë ì컬 íê²½ì ëí 참조를 ê°ìµëë¤.
ì½ëìì ë³ìì ì ê·¼í ë, 먼ì ë´ë¶ ë ì컬 íê²½ì ê²ì ë²ìë¡ ì¡ìµëë¤. ë´ë¶ ë ì컬 íê²½ìì ìíë ë³ì를 ì°¾ì§ ëª»íë©´ ê²ì ë²ì를 ë´ë¶ ë ì컬 íê²½ì´ ì°¸ì¡°íë ì¸ë¶ ë ì컬 íê²½ì¼ë¡ íì¥í©ëë¤. ì´ ê³¼ì ì ê²ì ë²ìê° ì ì ë ì컬 íê²½ì¼ë¡ íì¥ë ëê¹ì§ ë°ë³µë©ëë¤.
ì ì ë ì컬 íê²½ì ëë¬í ëê¹ì§ ë³ì를 ì°¾ì§ ëª»íë©´ ì격 모ëìì ìë¬ê° ë°ìí©ëë¤. ì°¸ê³ ë¡ ë¹ ì격 모ëìì ì ìëì§ ìì ë³ìì ê°ì í ë¹íë ¤ê³ íë©´ ìë¬ê° ë°ìíë ëì ìë¡ì´ ì ì ë³ìê° ë§ë¤ì´ì§ëë°, ì´ë íì í¸íì±ì ìí´ ë¨ììë 기ë¥ì ëë¤.
ììì 그림ì ë³´ë©´ì ë³ì ê²ìì´ ì´ë»ê² ì§íëëì§ ë¤ì ì ë¦¬í´ ë´ ìë¤.
- í¨ì
sayë´ë¶ìalertìì ë³ìnameì ì ê·¼í ë, 먼ì ë´ë¶ ë ì컬 íê²½ì ì´í´ë´ ëë¤. ë´ë¶ ë ì컬 íê²½ìì ë³ìnameì ì°¾ììµëë¤. alertìì ë³ìphraseì ì ê·¼íë ¤ëë°,phraseì ììíë íë¡í¼í°ê° ë´ë¶ ë ì컬 íê²½ì ììµëë¤. ë°ë¼ì ê²ì ë²ìë ì¸ë¶ ë ì컬 íê²½ì¼ë¡ íì¥ë©ëë¤. ì¸ë¶ ë ì컬 íê²½ììphrase를 ì°¾ììµëë¤.
ë¨ê³ 4. í¨ì를 ë°ííë í¨ì
makeCounter ììë¡ ëìê° ë´
ìë¤.
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
makeCounter()를 í¸ì¶íë©´ í¸ì¶í ëë§ë¤ ìë¡ì´ ë ì컬 íê²½ ê°ì²´ê° ë§ë¤ì´ì§ê³ ì¬ê¸°ì makeCounter를 ì¤ííëë° íìí ë³ìë¤ì´ ì ì¥ë©ëë¤.
ì쪽ìì ì´í´ë³¸ say("John") ììì ë§ì°¬ê°ì§ë¡ makeCounter()를 í¸ì¶í ëë ë ê°ì ë ì컬 íê²½ì´ ë§ë¤ì´ì§ëë¤.
ê·¸ë°ë° ì쪽ìì ì´í´ë³¸ say("John") ììì makeCounter() ìììë ì°¨ì´ì ì´ íë ììµëë¤. makeCounter()ê° ì¤íëë ëì¤ì 본문(return count++)ì´ íì¤ ì§ë¦¬ì¸ ì¤ì²© í¨ìê° ë§ë¤ì´ì§ë¤ë ì ì
ëë¤. íì¬ë ì¤ì²©í¨ìê° ìì±ëê¸°ë§ íê³ ì¤íì ëì§ ìì ìíì
ëë¤.
ì¬ê¸°ì ì¤ìí ì¬ì¤ì´ íë ììµëë¤. 모ë í¨ìë í¨ìê° ìì±ë ê³³ì ë ì컬 íê²½ì 기ìµíë¤ë ì ì
ëë¤. í¨ìë [[Environment]]ë¼ ë¶ë¦¬ë ì¨ê¹ íë¡í¼í°ë¥¼ ê°ëë°, ì¬ê¸°ì í¨ìê° ë§ë¤ì´ì§ ê³³ì ë ì컬 íê²½ì ëí ì°¸ì¡°ê° ì ì¥ë©ëë¤.
ë°ë¼ì counter.[[Environment]]ì {count: 0}ì´ ìë ë ì컬 íê²½ì ëí ì°¸ì¡°ê° ì ì¥ë©ëë¤. í¸ì¶ ì¥ìì ìê´ìì´ í¨ìê° ìì ì´ íì´ë ê³³ì 기ìµí ì ìë ê±´ ë°ë¡ ì´ [[Environment]] íë¡í¼í° ëë¶ì
ëë¤. [[Environment]]ë í¨ìê° ìì±ë ë ë± í ë² ê°ì´ ì¸í
ëê³ ììí ë³íì§ ììµëë¤.
counter()를 í¸ì¶íë©´ ê° í¸ì¶ë§ë¤ ìë¡ì´ ë ì컬 íê²½ì´ ìì±ë©ëë¤. ê·¸ë¦¬ê³ ì´ ë ì컬 íê²½ì counter.[[Environment]]ì ì ì¥ë ë ì컬 íê²½ì ì¸ë¶ ë ì컬 íê²½ì¼ë¡ì 참조í©ëë¤.
ì¤í íë¦ì´ ì¤ì²© í¨ìì 본문ì¼ë¡ ëì´ì¤ë©´ count ë³ìê° íìíë°, 먼ì ìì²´ ë ì컬 íê²½ìì ë³ì를 ì°¾ìµëë¤. ìµëª
ì¤ì²© í¨ìì ì§ìë³ìê° ì기 ë문ì ì´ ë ì컬 íê²½ì ë¹ì´ìë ìí©ì
ëë¤(<empty>). ì´ì counter()ì ë ì컬 íê²½ì´ ì°¸ì¡°íë ì¸ë¶ ë ì컬 íê²½ìì count를 ì°¾ìë´
ìë¤. count를 ì°¾ììµëë¤!
ì´ì count++ê° ì¤íëë©´ì count ê°ì´ 1 ì¦ê°í´ì¼íëë°, ë³ì«ê° ê°±ì ì ë³ìê° ì ì¥ë ë ì컬 íê²½ìì ì´ë¤ì§ëë¤.
ë°ë¼ì ì¤íì´ ì¢ ë£ë íì ìíë ë¤ìê³¼ ê°ìµëë¤.
counter()를 ì¬ë¬ ë² í¸ì¶íë©´ count ë³ìê° 2, 3ì¼ë¡ ì¦ê°íë ì´ì ê° ë°ë¡ ì¬ê¸°ì ììµëë¤.
'í´ë¡ì (closure)'ë ê°ë°ìë¼ë©´ ìê³ ìì´ì¼ í íë¡ê·¸ëë° ì©ì´ì ëë¤.
í´ë¡ì ë ì¸ë¶ ë³ì를 기ìµíê³ ì´ ì¸ë¶ ë³ìì ì ê·¼í ì ìë í¨ì를 ì미í©ëë¤. ëªëª ì¸ì´ìì í´ë¡ì 를 구ííë ê² ë¶ê°ë¥íê±°ë í¹ìí ë°©ìì¼ë¡ í¨ì를 ìì±í´ì¼ í´ë¡ì 를 ë§ë¤ ì ììµëë¤. íì§ë§ ìë°ì¤í¬ë¦½í¸ìì 모ë í¨ìê° ìì°ì¤ë½ê² í´ë¡ì ê° ë©ëë¤. ìì¸ê° íë ì긴 íë° ìì¸í ë´ì©ì new Function 문ë²ìì ë¤ë£¨ëë¡ íê² ìµëë¤.
ìì ì ì ë¦¬í´ ë´
ìë¤. ìë°ì¤í¬ë¦½í¸ì í¨ìë ì¨ê¹ íë¡í¼í°ì¸ [[Environment]]를 ì´ì©í´ ìì ì´ ì´ëì ë§ë¤ì´ì¡ëì§ë¥¼ 기ìµí©ëë¤. í¨ì 본문ìì [[Environment]]를 ì¬ì©í´ ì¸ë¶ ë³ìì ì ê·¼í©ëë¤.
íë°í¸ìë ê°ë°ì ì±ì© ì¸í°ë·°ìì "í´ë¡ì ê° ë¬´ìì
ëê¹?"ë¼ë ì§ë¬¸ì ë°ì¼ë©´, í´ë¡ì ì ì ì를 ë§íê³ ìë°ì¤í¬ë¦½í¸ìì ì 모ë í¨ìê° í´ë¡ì ì¸ì§ì ê´í´ ì¤ëª
íë©´ ë ê² ê°ìµëë¤. ì´ë [[Environment]] íë¡í¼í°ì ë ì컬 íê²½ì´ ì´ë¤ ë°©ìì¼ë¡ ëìíëì§ì ëí ì¤ëª
ì ë§ë¶ì´ë©´ ì¢ìµëë¤.
ê°ë¹ì§ 컬ë ì
í¨ì í¸ì¶ì´ ëëë©´ í¨ìì ëìíë ë ì컬 íê²½ì´ ë©ëª¨ë¦¬ìì ì ê±°ë©ëë¤. í¨ìì ê´ë ¨ë ë³ìë¤ì ì´ë 모ë ì¬ë¼ì§ì£ . í¨ì í¸ì¶ì´ ëëë©´ ê´ë ¨ ë³ì를 참조í ì ìë ì´ì ê° ë°ë¡ ì¬ê¸°ì ììµëë¤. ìë°ì¤í¬ë¦½í¸ìì 모ë ê°ì²´ë ëë¬ ê°ë¥í ìíì¼ ëë§ ë©ëª¨ë¦¬ì ì ì§ë©ëë¤.
ê·¸ë°ë° í¸ì¶ì´ ëë íìë ì¬ì í ëë¬ ê°ë¥í ì¤ì²© í¨ìê° ìì ì ììµëë¤. ì´ëë ì´ ì¤ì²©í¨ìì [[Environment]] íë¡í¼í°ì ì¸ë¶ í¨ì ë ì컬 íê²½ì ëí ì ë³´ê° ì ì¥ë©ëë¤. ëë¬ ê°ë¥í ìíê° ëë ê²ì´ì£ .
í¨ì í¸ì¶ì ëë¬ì§ë§ ë ì컬 íê²½ì´ ë©ëª¨ë¦¬ì ì ì§ëë ì´ì ë ë°ë¡ ì´ ë문ì ëë¤.
ìì:
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // g.[[Environment]]ì f() í¸ì¶ ì ë§ë¤ì´ì§ë
// ë ì컬 íê²½ ì ë³´ê° ì ì¥ë©ëë¤.
ê·¸ë°ë° ì´ë ê² ì¤ì²©í¨ì를 ì¬ì©í ëë 주ìí ì ì´ ììµëë¤. f()를 ì¬ë¬ ë² í¸ì¶íê³ ê·¸ 결과를 ì´ëê°ì ì ì¥íë ê²½ì°, í¸ì¶ ì ë§ë¤ì´ì§ë ê° ë ì컬 íê²½ 모ëê° ë©ëª¨ë¦¬ì ì ì§ëë¤ë ì ì
ëë¤. ìë ìì를 ì¤ííë©´ 3ê°ì ë ì컬 íê²½ì´ ë§ë¤ì´ì§ëë°, ê° ë ì컬 íê²½ì ë©ëª¨ë¦¬ìì ìì ëì§ ììµëë¤.
function f() {
let value = Math.random();
return function() { alert(value); };
}
// ë°°ì´ ìì ì¸ í¨ìë ê°ê° f()를 í¸ì¶í ë ìì±ë
// ë ì컬 í경과 ì°ê´ ê´ê³ë¥¼ 맺ìµëë¤.
let arr = [f(), f(), f()];
ë ì컬 íê²½ ê°ì²´ë ë¤ë¥¸ ê°ì²´ì ë§ì°¬ê°ì§ë¡ ëë¬í ì ìì ë ë©ëª¨ë¦¬ìì ìì ë©ëë¤. í´ë¹ ë ì컬 íê²½ ê°ì²´ë¥¼ 참조íë ì¤ì²© í¨ìê° íëë¼ë ìì¼ë©´ ì¬ë¼ì§ì§ ìì£ .
ìë ìì ê°ì´ ì¤ì²© í¨ìê° ë©ëª¨ë¦¬ìì ìì ëê³ ë íìì¼, ì´ë¥¼ ê°ì¸ë ë ì컬 íê²½(ê·¸ë¦¬ê³ ê·¸ ìì ë³ìì¸ value)ë ë©ëª¨ë¦¬ìì ì ê±°ë©ëë¤.
function f() {
let value = 123;
return function() {
alert(value);
}
}
let g = f(); // gê° ì´ììë ëìì ì°ê´ ë ì컬 íê²½ë ë©ëª¨ë¦¬ì ì´ìììµëë¤.
g = null; // ëë¬í ì ìë ìíê° ëìì¼ë¯ë¡ ë©ëª¨ë¦¬ìì ìì ë©ëë¤.
ìµì í íë¡ì¸ì¤
ììì ë³´ìë¯ì´, í¨ìê° ì´ììë ëìì ì´ë¡ ìì¼ë¡ 모ë ì¸ë¶ ë³ì ìì ë©ëª¨ë¦¬ì ì ì§ë©ëë¤.
ê·¸ë¬ë ì¤ì ë¡ë ìë°ì¤í¬ë¦½í¸ ìì§ì´ ì´ë¥¼ ì§ìí´ì ìµì íí©ëë¤. ìë°ì¤í¬ë¦½í¸ ìì§ì ë³ì ì¬ì©ì ë¶ìíê³ ì¸ë¶ ë³ìê° ì¬ì©ëì§ ìëë¤ê³ íë¨ëë©´ ì´ë¥¼ ë©ëª¨ë¦¬ìì ì ê±°í©ëë¤.
ëë²ê¹ ì, ìµì í ê³¼ì ìì ì ê±°ë ë³ì를 ì¬ì©í ì ìë¤ë ì ì V8 ìì§(Chrome, Edge, Operaìì ì°ì)ì 주ì ë¶ìì©ì ëë¤.
Chrome ë¸ë¼ì°ì ìì ê°ë°ì ë구를 ì´ê³ ìëì ì½ë를 ì¤íí´ë´ ìë¤.
ê·¸ë¦¬ê³ ì¤íì´ ì¼ì ì¤ì§ëìì ë ì½ìì alert(value)를 ì
ë ¥í´ ë³´ì¸ì.
function f() {
let value = Math.random();
function g() {
debugger; // Uncaught ReferenceError: value is not definedê° ì¶ë ¥ë©ëë¤.
}
return g;
}
let g = f();
g();
ì ìëì§ ìì ë³ìë¼ë ìë¬ê° ì¶ë ¥ëë¤ì! ì´ë¡ ìì¼ë¡ë valueì ì ê·¼í ì ìì´ì¼ íì§ë§ ìµì í ëìì´ ëì´ì ì´ë° ìë¬ê° ë°ìíìµëë¤.
ì´ë° ì¸ë¶ ë³ì ìµì íë í¥ë¯¸ë¡ì´ ëë²ê¹ ì´ì를 ë°ììí¤ê³¤ í©ëë¤. ìì¸ì ì°¾ë ë° ë§ì ìê°ì íë¹íê² ëë©´ í¥ë¯¸ë¡ì§ ìê² ì§ë§ ë§ì´ì£ . ë°ìí ì ìë ìí© ì¤ íë를 ì¬ê¸°ì ìê°í´ ë리ëë¡ íê² ìµëë¤. ìì를 ì¤íí´ ìëí ë³ì ëì ê°ì ì´ë¦ì ê°ì§ ë¤ë¥¸ ì¸ë¶ ë³ìê° ì¶ë ¥ëë 걸 íì¸í´ ë´ ìë¤.
let value = "ì´ë¦ì´ ê°ì ë¤ë¥¸ ë³ì";
function f() {
let value = "ê°ì¥ ê°ê¹ì´ ë³ì";
function g() {
debugger; // ì½ìì alert(value);를 ì
ë ¥íë©´ 'ì´ë¦ì´ ê°ì ë¤ë¥¸ ë³ì'ê° ì¶ë ¥ë©ëë¤.
}
return g;
}
let g = f();
g();
ì´ë° V8ë§ì ë¶ìì©ì 미리 ìì ëë ê²ì´ ì¢ìµëë¤. Chromeì´ë Edge, Operaìì ëë²ê¹ íë ê²½ì°ë¼ë©´ ì¸ì ê° ì´ ì´ì를 ë§ëê² ë í ëê¹ì.
ì´ ë¶ìì©ì ë²ê·¸ë¼ê¸°ë³´ë¤ë V8ë§ì í¹ë³í 기ë¥ì´ë¼ê³ ìê°íìë©´ ë ê² ê°ìµëë¤. 미ëì ì´ ê¸°ë¥ì ë³ê²½ë ì ììµëë¤. ìµì í ê³¼ì ìì ì¸ë¶ ë³ìê° ì´ë»ê² ì²ë¦¬ëìëì§ íì¸íê³ ì¶ë¤ë©´ ì´ íì´ì§ë¡ ëìì¤ì ì ìì를 ì¤íí´ ë³´ì¸ì.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.