ì´ë² ì ìì í¹ì ìì§ ì¼ì´ì¤(edge case)를 ì¤ëª í기 ìí ì¬í ë´ì©ì ë¤ë£¹ëë¤.
ìë ¨ë ìë¹ìì ê°ë°ìê° ì´ ì ìì ë¤ë£° ë´ì©ì 모른 ì±ë¡ ì¼íê³ ìì§ë§ 문ì ê° ìê³ , ì¤ìí ë´ì©ì ìë기 ë문ì ìë°ì¤í¬ë¦½í¸ ë´ë¶ìì ì´ë¤ ì¼ì´ ì¼ì´ëëì§ ìê³ ì¶ì§ ìë¤ë©´ ì´ë² ê¸ì ëì´ê°ê±°ë 미ë¤ë ê´ì°®ìµëë¤.
ë³µì¡í ìí©ìì ë©ìë를 í¸ì¶íë©´ this ê°ì ìì´ë²ë¦¬ë ê²½ì°ê° ìê¹ëë¤.
ìì를 ì´í´ë´ ìë¤.
let user = {
name: "John",
hi() { alert(this.name); },
bye() { alert("Bye"); }
};
user.hi(); // John (ê°ë¨í í¸ì¶ì ìëí ëë¡ ì ëìí©ëë¤.)
// nameì ë°ë¼ user.hië user.byeê° í¸ì¶ëê² í´ë´
ìë¤.
(user.name == "John" ? user.hi : user.bye)(); // TypeError: Cannot read property 'name' of undefined
ë§ì§ë§ ì¤ìì ì¡°ê±´ë¶ ì°ì°ì를 ì¬ì©í´ user.hië user.bye ì¤ íëê° í¸ì¶ëëë¡ íìµëë¤. userì nameì´ "John"ì´ë¯ë¡ user.hiê° í¸ì¶ë ê²ì´ë¼ ììíë©° ë§ì´ì£ .
ê·¸ë°ë° ìë¬ê° ë°ìíìµëë¤. ë¤ì ()ê° ìì´ì ë©ìë hiê° ì¦ì í¸ì¶ë ê²ì´ë¼ ììíëë° ìíë ëë¡ ëì§ ììë¤ì.
ìë¬ë ë©ìë를 í¸ì¶í ë "this"ì undefinedê° í ë¹ëì기 ë문ì ë°ìíìµëë¤.
ë§ì§ë§ ì¤ì´ ìëì ê°ìë¤ë©´ ìë¬ ìì´ ì ìëíì ê²ëë¤.
user.hi();
ê·¸ë°ë° ìë ì½ëìì ìë¬ê° ë°ìíì£ .
(user.name == "John" ? user.hi : user.bye)();
ìì¸ì´ ëê¹ì? ìì¸ì ìë ¤ë©´ obj.method()를 í¸ì¶íì ë, ë´ë¶ìì ì´ë¤ ì¼ì´ ì¼ì´ëëì§ ììì¼ í©ëë¤.
참조 íì ìì¸í ìì보기
ì½ë를 ì ì¬í ì´í´ë³´ë©´ obj.method()ì ì°ì°ì´ ë ê° ìë¤ë 걸 ëì¹ì± ì ììµëë¤.
- ì
'.'ì ê°ì²´ íë¡í¼í°obj.methodì ì ê·¼í©ëë¤. - ê´í¸
()ë ì ê·¼í íë¡í¼í°(ë©ìë)를 ì¤íí©ëë¤.
ê·¸ë ë¤ë©´ 첫 ë²ì§¸ ì°ì°ìì ì»ì this ì ë³´ê° ì´ë»ê² ë ë²ì§¸ ì°ì°ì¼ë¡ ì ë¬ë ê¹ì?
ë ì°ì°ì ê°ê° ë³ëì ì¤ìì ëìë¤ë©´ this ì 보를 ìë ê±´ íì¤í©ëë¤.
let user = {
name: "John",
hi() { alert(this.name); }
}
// ë©ìë ì 근과 í¸ì¶ì ë³ëì ì¤ìì ì¤íí¨
let hi = user.hi;
hi(); // thisê° undefinedì´ê¸° ë문ì ìë¬ê° ë°ìí©ëë¤.
hi = user.hiìì í¨ìê° ë³ìì í ë¹ë©ëë¤. ê·¸ë°ë° ë§ì§ë§ ì¤ê³¼ë ìì í ë
립ì ì¼ë¡ ëìíë¯ë¡ thisì ìë¬´ë° ê°ë ì ì¥ëì§ ììµëë¤.
user.hi()를 ìëí ëë¡ ëììí¤ê¸° ìí´ ìë°ì¤í¬ë¦½í¸ë ììì를 ì¬ì©í©ëë¤. '.'ì´ í¨ìê° ìë, 참조 íì
(Reference Type) ê°ì ë°ííê² íì£ .
참조 íì ì 'ëª ì¸ì ììë§ ì¬ì©ëë íì (specification type)'ì ëë¤. ê°ë°ìê° ì¤ì ë¡ ì¬ì©í ì ììµëë¤.
참조 íì
ì ìíë ê°ì (base, name, strict)ì´ ì¡°í©ë íí를 ë±ëë¤.
base: ê°ì²´name: íë¡í¼í°ì ì´ë¦strict: ì격 모ëìì true
user.hië¡ íë¡í¼í°ì ì ê·¼íë©´ í¨ìê° ìë, 참조í(참조 íì
) ê°ì ë°íí©ëë¤. ì격 모ëìì ìëì ê°ì ê°ì´ ë°íëì£ .
// 참조í ê°
(user, "hi", true)
참조í ê°ì ê´í¸ ()를 ë¶ì¬ í¸ì¶íë©´ ê°ì²´, ê°ì²´ì ë©ìëì ì°ê´ë 모ë ì 보를 ë°ìµëë¤. ì´ ì 보를 기ë°ì¼ë¡ this(=user)ê° ê²°ì ë©ëë¤.
ì´ë ê² ì°¸ì¡° íì
ì ë´ë¶ìì ì .ì°ì°ìì ììë¸ ì 보를 ê´í¸ ()ë¡ ì ë¬í´ì£¼ë âì¤ê°ì¸â ìí ì í©ëë¤.
ê·¸ë°ë° ì ì°ì° ì´ì¸ì ì°ì°(í ë¹ ì°ì° ë±)ì 참조 íì
ì íµì§¸ë¡ ë²ë¦¬ê³ user.hi ê°(í¨ì)ë§ ë°ì ì ë¬í©ëë¤. ì´ ë문ì ì ì´ì¸ì ì°ì°ìì this ì ë³´ê° ì¬ë¼ì§ëë¤.
obj.method() ê°ì´ ì ì ì¬ì©íê±°ë, obj[method]() ê°ì´ ëê´í¸ë¥¼ ì¬ì©í´ í¨ì를 í¸ì¶íì ëë§ this ê°ì´ ìëí ëë¡ ì ë¬ë©ëë¤. ì´ë° 문ì ë func.bind() ë±ì ì´ì©íë©´ í´ê²° í ì ìëë°, ì´ì ëí´ì ì¶íì ììë³´ëë¡ íê² ìµëë¤.
ìì½
참조 íì ì ìë°ì¤í¬ë¦½í¸ ë´ë¶ìì ì¬ì©ëë íì ì ëë¤.
.ì´ë ëê´í¸ë¥¼ ì¬ì©í´ ê°ì²´ íë¡í¼í°ì¸ ë©ìë(obj.method())ì ì ê·¼íë ¤ íë©´ ì íí íë¡í¼í° ê°ì´ ë°íëë ê²ì´ ìëë¼ í¹ë³í ííì ê°ì¸ â참조 íì
â ê°ì´ ë°íë©ëë¤. ì´ ì°¸ì¡°íì
ê°ì íë¡í¼í° ê°ê³¼ íë¡í¼í°ê° ì ìë ê°ì²´ ì ë³´ê° ë´ê²¨ììµëë¤.
()를 ì¬ì©í´ ë©ìë를 í¸ì¶í ë, ë©ìë ë´ìì ì¬ì©ëë thisì ì ëë¡ ë ê°ì²´ ì 보를 ì ë¬í´ ì¤ ì ìë ì´ì ê° ë°ë¡ â참조 íì
â ëë¶ì
ëë¤.
ê·¸ë°ë° .ì´ë ëê´í¸ ì´ì¸ì ì°ì°ìì 참조 íì
ì´ ê·¸ë¥ íë¡í¼í° ê°ì¼ë¡ ë³í´ë²ë¦½ëë¤. ê°ì²´ ë©ìëë¼ë©´ í¨ì«ê°ì¼ë¡ ë³í´ë²ë¦¬ì£ .
ì´ë° ë´ë¶ ëìì ë³´ì´ì§ ìë ê³³ìì ì¼ì´ë©ëë¤. 참조 íì ì´ ì´ë»ê² ëìíëì§ ììì¼ í´ê²°í ì ìë 문ì ë ííìì ì´ì©í´ ëì ì¼ë¡ ê°ì²´ìì ë©ìë를 ê°ì ¸ì¬ ëì ê°ì´ ì주 ë°ìíì§ ììµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.