ìë°ì¤í¬ë¦½í¸ìì í¨ìë ê°ì¼ë¡ ì·¨ê¸ë©ëë¤. ì´ì ëí´ì ì´ë¯¸ ë°°ìì ìê³ ê³ì¤ ê²ëë¤.
모ë ê°ì ìë£íì ê°ì§ê³ ìëë°, ê·¸ë ë¤ë©´ í¨ìì ìë£íì 무ìì¼ê¹ì?
í¨ìë ê°ì²´ì ëë¤.
í¨ìë í¸ì¶ì´ ê°ë¥í(callable) 'íë ê°ì²´âë¼ê³ ì´í´íë©´ ì½ìµëë¤. ì°ë¦¬ë í¨ì를 í¸ì¶ í ì ìì ë¿ë§ ìëë¼ ê°ì²´ì²ë¼ í¨ìì íë¡í¼í°ë¥¼ ì¶ê°Â·ì ê±°íê±°ë 참조를 íµí´ ì ë¬í ìë ììµëë¤.
ânameâ íë¡í¼í°
í¨ì ê°ì²´ì ëª ê°ì§ ì¸ë§í íë¡í¼í°ê° ììµëë¤.
ânameâ íë¡í¼í°ë¥¼ ì¬ì©íë©´ í¨ì ì´ë¦ì ê°ì ¸ì¬ ì ìì£ .
function sayHi() {
alert("Hi");
}
alert(sayHi.name); // sayHi
í¨ì ê°ì²´ì ì´ë¦ì í ë¹í´ì£¼ë ë¡ì§ì ì주 ëëí´ì ìµëª í¨ìë¼ë ìëì¼ë¡ ì´ë¦ì´ í ë¹ë©ëë¤.
let sayHi = function() {
alert("Hi");
};
alert(sayHi.name); // sayHi (ìµëª
í¨ìì´ì§ë§ ì´ë¦ì´ ìë¤ì!)
기본ê°ì ì¬ì©í´ ì´ë¦ì í ë¹í ê²½ì°ìë ë§ì°¬ê°ì§ì£ .
function f(sayHi = function() {}) {
alert(sayHi.name); // sayHi (ì´ë¦ì´ ìë¤ì!)
}
f();
ìë°ì¤í¬ë¦½í¸ ëª ì¸ììì ì ìë ì´ ê¸°ë¥ì 'contextual nameâì´ë¼ê³ ë¶ë¦ ëë¤. ì´ë¦ì´ ìë í¨ìì ì´ë¦ì ì§ì í ë 컨í ì¤í¸ìì ì´ë¦ì ê°ì ¸ì¤ì£ .
ê°ì²´ ë©ìëì ì´ë¦ë ânameâ íë¡í¼í°ë¥¼ ì´ì©í´ ê°ì ¸ì¬ ì ììµëë¤.
let user = {
sayHi() {
// ...
},
sayBye: function() {
// ...
}
}
alert(user.sayHi.name); // sayHi
alert(user.sayBye.name); // sayBye
ê·¸ë°ë° ê°ì²´ ë©ìë ì´ë¦ì í¨ìì²ë¼ ìë í ë¹ì´ ëì§ ììµëë¤. ì ì í ì´ë¦ì ì¶ë¡ íë ê² ë¶ê°ë¥í ìí©ì´ ìëë°, ì´ë name íë¡í¼í°ì ë¹ ë¬¸ìì´ì´ ì ì¥ë©ëë¤. ìëì ê°ì´ ë§ì´ì£ .
// ë°°ì´ ììì í¨ì를 ìì±í¨
let arr = [function() {}];
alert( arr[0].name ); // <ë¹ ë¬¸ìì´>
// ìì§ì´ ì´ë¦ì ì¤ì í ì ìì´ì name íë¡í¼í°ì ê°ì´ ë¹ ë¬¸ìì´ì´ ë¨
ì¤ë¬´ìì ëë¶ë¶ì í¨ìë ì´ë¦ì´ ìì¼ë¯ë¡ ìì ê°ì ìí©ì ì ë°ìíì§ ììµëë¤.
âlengthâ íë¡í¼í°
ë´ì¥ íë¡í¼í° lengthë í¨ì 매ê°ë³ìì ê°ì를 ë°íí©ëë¤. ìì를 ì´í´ë´
ìë¤.
function f1(a) {}
function f2(a, b) {}
function many(a, b, ...more) {}
alert(f1.length); // 1
alert(f2.length); // 2
alert(many.length); // 2
ì ìì를 íµí´ ëë¨¸ì§ ë§¤ê°ë³ìë ê°ìì í¬í¨ëì§ ìëë¤ë ì¬ì¤ ëí íì¸í´ ë³´ììµëë¤.
íí¸, length íë¡í¼í°ë ë¤ë¥¸ í¨ì ììì ëìíë í¨ìì íì
ì ê²ì¬(type introspection) í ëë ì¢
ì¢
ì¬ì©ë©ëë¤.
ì§ë¬¸ì ì°ì¼ questionê³¼ ì§ë¬¸ì ëí ëµì ë°ë¼ í¸ì¶í ììì ìì handler í¨ì를 í¨ê» ë°ë í¨ì ask를 ììë¡ ì´ì ëí´ ììë´
ìë¤.
ì¬ì©ìê° ëµì ì ì¶íë©´ askë í¸ë¤ë¬ í¨ì를 í¸ì¶í©ëë¤. ì´ë ì°ë¦¬ë ë ì¢
ë¥ì í¸ë¤ë¬ í¨ì를 askì ì ë¬í ì ììµëë¤.
- ì¸ìê° ìë í¨ìë¡, ì¬ì©ìê° OK를 í´ë¦íì ëë§ í¸ì¶ë¨
- ì¸ìê° ìë í¨ìë¡, ì¬ì©ìê° OK를 í´ë¦íë Cancelì í´ë¦íë í¸ì¶ë¨
ê·¸ë¦¬ê³ handler.length íë¡í¼í°ë¥¼ ì¬ì©íë©´ ìí©ì ë§ë handler를 í¸ì¶í ì ììµëë¤.
ì¬ì©ìê° ê¸ì ì ì¸ ëëµì íì ë ì¬ì© í ì¸ìê° ìë í¸ë¤ë¬ë¥¼ íë ë§ë¤ê³ , ì¬ì©ìì ìëµ ì¢
ë¥ì ê´ê³ìì´ ë²ì©ì ì¼ë¡ ì¬ì©í ë§í í¸ë¤ë¬ë 구ì¶í´ ask ë´ë¶ìì handler.lengthì í¨ê» ì¬ì©íë©´ ëì£ .
function ask(question, ...handlers) {
let isYes = confirm(question);
for(let handler of handlers) {
if (handler.length == 0) {
if (isYes) handler();
} else {
handler(isYes);
}
}
}
// ì¬ì©ìê° OK를 í´ë¦í ê²½ì°, í¸ë¤ë¬ ë ê°ë¥¼ 모ë í¸ì¶í¨
// ì¬ì©ìê° Cancelì í´ë¦í ê²½ì°, ë ë²ì§¸ í¸ë¤ë¬ë§ í¸ì¶í¨
ask("ì§ë¬¸ ìì¼ì ê°ì?", () => alert('OK를 ì ííì
¨ìµëë¤.'), result => alert(result));
ì¸ìì ì¢
ë¥ì ë°ë¼(ì ìììì ì¸ìì length íë¡í¼í° ê°ì ë°ë¼) ì¸ì를 ë¤ë¥´ê² ì²ë¦¬íë ë°©ìì íë¡ê·¸ëë° ì¸ì´ìì ë¤íì±(polymorphism) ì´ë¼ê³ ë¶ë¦
ëë¤. ìë°ì¤í¬ë¦½í¸ ë¼ì´ë¸ë¬ë¦¬ë¥¼ ë¯ì´ë³´ë¤ ë³´ë©´ ë¤íì±ì´ 곳곳ìì ì¬ì©ëê³ ìë¤ë ê²ì íì¸í ì ììµëë¤.
커ì¤í íë¡í¼í°
í¨ìì ìì²´ì ì¼ë¡ ë§ë íë¡í¼í°ë¥¼ ì¶ê°í ìë ììµëë¤.
ì´ë° í¹ì§ì ì´ì©í´ í¨ì í¸ì¶ íì를 counter íë¡í¼í°ì ì ì¥í´ë³´ê² ìµëë¤.
function sayHi() {
alert("Hi");
// í¨ì를 ëª ë² í¸ì¶íëì§ ì¸ë´
ìë¤.
sayHi.counter++;
}
sayHi.counter = 0; // ì´ê¹ê°
sayHi(); // Hi
sayHi(); // Hi
alert( `í¸ì¶ íì: ${sayHi.counter}í` ); // í¸ì¶ íì: 2í
sayHi.counter = 0ì ê°ì´ í¨ìì íë¡í¼í°ë¥¼ í ë¹í´ë í¨ì ë´ì ì§ìë³ì counterê° ë§ë¤ì´ì§ì§ ììµëë¤. counter íë¡í¼í°ì ë³ì let counterë ì í ê´ê³ê° ììµëë¤.
íë¡í¼í°ë¥¼ ì ì¥íë ê²ì²ë¼ í¨ì를 ê°ì²´ì²ë¼ ë¤ë£° ì ìì§ë§, ì´ë ì¤íì ì무 ìí¥ì ë¼ì¹ì§ ììµëë¤. ë³ìë í¨ì íë¡í¼í°ê° ìëê³ í¨ì íë¡í¼í°ë ë³ìê° ìë기 ë문ì ëë¤. ë ì¬ì´ìë ê³µíµì ì´ ììµëë¤.
í´ë¡ì ë í¨ì íë¡í¼í°ë¡ ëì²´í ì ììµëë¤. ë³ìì ì í¨ë²ìì í´ë¡ì ì±í°ìì ì´í´ë³¸ ë° ìë counter í¨ì를 í¨ì íë¡í¼í°ë¥¼ ì¬ì©í´ ë°ê¿ë³´ëë¡ íê² ìµëë¤.
function makeCounter() {
// let count = 0 ëì ìë ë©ìë(íë¡í¼í°)를 ì¬ì©í¨
function counter() {
return counter.count++;
};
counter.count = 0;
return counter;
}
let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1
ì´ì countë ì¸ë¶ ë ì컬 íê²½ì´ ìë í¨ì íë¡í¼í°ì ë°ë¡ ì ì¥ë©ëë¤.
ê·¸ë°ë° ê³¼ì° ì´ë ê² í¨ì íë¡í¼í°ì ì 보를 ì ì¥íë ê² í´ë¡ì 를 ì¬ì©íë ê²ë³´ë¤ ëì ë°©ë²ì¼ê¹ì?
ë ë°©ë²ì ì°¨ì´ì ì count ê°ì´ ì¸ë¶ ë³ìì ì ì¥ëì´ìë ê²½ì° ëë¬ë©ëë¤. í´ë¡ì 를 ì¬ì©í ê²½ì°ì ì¸ë¶ ì½ëìì countì ì ê·¼í ì ììµëë¤. ì¤ì§ ì¤ì²©í¨ì ë´ììë§ count ê°ì ìì í ì ììµëë¤. ë°ë©´ í¨ì íë¡í¼í°ë¥¼ ì¬ì©í´ count를 í¨ìì ë°ì¸ë©ìí¨ ê²½ì°ì ë¤ì ììì ê°ì´ ì¸ë¶ìì ê°ì ìì í ì ììµëë¤.
function makeCounter() {
function counter() {
return counter.count++;
};
counter.count = 0;
return counter;
}
let counter = makeCounter();
counter.count = 10;
alert( counter() ); // 10
ë°ë¼ì 구í ë°©ë²ì 목ì ì ë°ë¼ ì ííë©´ ë ê² ê°ìµëë¤.
ê¸°ëª í¨ì ííì
ê¸°ëª í¨ì ííì(Named Function Expression, NFE)ì ì´ë¦ì´ ìë í¨ì ííìì ëíë´ë ì©ì´ì ëë¤.
먼ì , ì¼ë° í¨ì ííìì ì´í´ë´ ìë¤.
let sayHi = function(who) {
alert(`Hello, ${who}`);
};
ì¬ê¸°ì ì´ë¦ì ë¶ì¬ë³´ê² ìµëë¤.
let sayHi = function func(who) {
alert(`Hello, ${who}`);
};
ì´ë ê² ì´ë¦ì ë¶ì¸ë¤ê³ í´ì ëê° ë¬ë¼ì§ë 걸ê¹ì? "func"ì´ë¼ë ì´ë¦ì ì´ë¤ ê²½ì°ì ë¶ì´ë 걸ê¹ì?
먼ì ì´ë ê² ì´ë¦ì ë¶ì¬ë ì í¨ìë ì¬ì í í¨ì ííìì´ë¼ë ì ì 주목í´ì¼ í©ëë¤. function ë¤ì "func"ì´ë¼ë ì´ë¦ì ë¶ì´ëë¼ë ì¬ì í ííìì í ë¹í íí를 ì ì§í기 ë문ì í¨ì ì ì¸ë¬¸ì¼ë¡ ë°ëì§ ììµëë¤.
ì´ë¦ì ì¶ê°íë¤ê³ í´ì 기존ì ëìíë 기ë¥ì´ ëìíì§ ìë ì¼ì ë°ìíì§ ììµëë¤.
sayHi()ë¡ í¸ì¶íë ê²ë ì¬ì í ê°ë¥í©ëë¤.
let sayHi = function func(who) {
alert(`Hello, ${who}`);
};
sayHi("John"); // Hello, John
ëì funcê³¼ ê°ì ì´ë¦ì ë¶ì´ë©´ ë ê°ì§ê° ë³íê° ìê¹ëë¤. ì´ ë ë³í ë문ì 기ëª
í¨ì ííìì ì¬ì©íë ê²ì´ì£ .
- ì´ë¦ì ì¬ì©í´ í¨ì ííì ë´ë¶ìì ì기 ìì ì 참조í ì ììµëë¤.
- ê¸°ëª í¨ì ííì ì¸ë¶ìì ê·¸ ì´ë¦ì ì¬ì©í ì ììµëë¤.
í¨ì sayHi를 ììë¡ ì´ì ëí´ ì´í´ë´
ìë¤. í¨ì sayHië whoì ê°ì´ ìë ê²½ì°, ì¸ì "Guest"를 ë°ê³ ì기 ìì ì í¸ì¶í©ëë¤.
let sayHi = function func(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
func("Guest"); // func를 ì¬ì©í´ì ìì ì í¸ì¶í©ëë¤.
}
};
sayHi(); // Hello, Guest
// íì§ë§ ìëì ê°ì´ func를 í¸ì¶íë ê±´ ë¶ê°ë¥í©ëë¤.
func(); // Error, func is not defined (기ëª
í¨ì ííì ë°ììë ê·¸ ì´ë¦ì ì ê·¼í ì ììµëë¤.)
ê·¸ë°ë° ì¬ê¸°ì ì ì¤ì²© í¸ì¶ì í ë sayHiëì funcì ì¬ì©íìê¹ì?
ì¬ì¤ ëë¶ë¶ì ê°ë°ìë ìëì ê°ì´ ì½ë를 ìì±í곤 í©ëë¤.
let sayHi = function(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
sayHi("Guest");
}
};
íì§ë§ ì´ë ê² ì½ë를 ìì±íë©´ ì¸ë¶ ì½ëì ìí´ sayHiê° ë³ê²½ë ì ìë¤ë 문ì ê° ìê¹ëë¤. í¨ì ííìì ìë¡ì´ ë³ìì í ë¹íê³ , 기존 ë³ìì nullì í ë¹íë©´ ìë¬ê° ë°ìíì£ .
let sayHi = function(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
sayHi("Guest"); // TypeError: sayHi is not a function
}
};
let welcome = sayHi;
sayHi = null;
welcome(); // ì¤ì²© sayHi í¸ì¶ì ë ì´ì ë¶ê°ë¥í©ëë¤!
ìë¬ë í¨ìê° sayHi를 ìì ì ì¸ë¶ ë ì컬 íê²½ìì ê°ì§ê³ ì¤ê¸° ë문ì ë°ìí©ëë¤. ì§ì(local) ë ì컬 íê²½ì sayHiê° ì기 ë문ì ì¸ë¶ ë ì컬 íê²½ìì sayHi를 ì°¾ëë°, í¨ì í¸ì¶ ìì ì ì¸ë¶ ë ì컬 íê²½ì sayHiì nullì´ ì ì¥ëì´ì기 ë문ì ìë¬ê° ë°ìí©ëë¤.
í¨ì ííìì ì´ë¦ì ë¶ì¬ì£¼ë©´ ë°ë¡ ì´ë° 문ì 를 í´ê²°í ì ììµëë¤.
ì½ë를 ìì í´ ë´ ìë¤.
let sayHi = function func(who) {
if (who) {
alert(`Hello, ${who}`);
} else {
func("Guest"); // ìíë ê°ì´ ì ëë¡ ì¶ë ¥ë©ëë¤.
}
};
let welcome = sayHi;
sayHi = null;
welcome(); // Hello, Guest (ì¤ì²© í¸ì¶ì´ ì ëë¡ ëìí¨)
"func"ì´ë¼ë ì´ë¦ì í¨ì ì§ì ìì¤(function-local)ì ì¡´ì¬íë¯ë¡ ì¸ë¶ ë ì컬 íê²½ìì ì°¾ì§ ììë ë©ëë¤. ì¸ë¶ ë ì컬 íê²½ìì ë³´ì´ì§ë ìì£ . í¨ì ííìì ë¶ì¸ ì´ë¦ì íì¬ í¨ìë§ ì°¸ì¡°íëë¡ ëª
ì¸ìì ì ìëì´ì기 ë문ì
ëë¤.
ì´ë ê² ê¸°ëª
í¨ì ííìì ì´ì©íë©´ sayHië welcome ê°ì ì¸ë¶ ë³ìì ë³ê²½ê³¼ ê´ê³ìì´ funcì´ë¼ë 'ë´ë¶ í¨ì ì´ë¦âì ì¬ì©í´ ì¸ì ë í¨ì ííì ë´ë¶ìì ì기 ìì ì í¸ì¶í ì ììµëë¤.
ì§ê¸ê¹ì§ ì´í´ë³¸ 'ë´ë¶ ì´ë¦âì í¨ì ííììë§ ì¬ì©í ì ìê³ , í¨ì ì ì¸ë¬¸ì ì¬ì©í ì ììµëë¤. í¨ì ì ì¸ë¬¸ì âë´ë¶â ì´ë¦ì ì§ì í ì ìë 문ë²ì´ ììµëë¤.
ê°ë°ì íë¤ ë³´ë©´ 믿ìë§í ë´ë¶ ì´ë¦ì´ íìí ëê° ì기곤 í©ëë¤. ì´ ë ë°ë¡ í¨ì ì ì¸ë¬¸ì ê¸°ëª í¨ì ííìì¼ë¡ ë¤ì ì ìíë©´ ë©ëë¤.
ìì½
í¨ìë ê°ì²´ì ëë¤.
ì´ë² ì±í°ìì ê°ì²´ë¡ìì í¨ììì ì¬ì© í ì ìë íë¡í¼í° ë ê°ì§ë¥¼ ë¤ë¤ë³´ììµëë¤.
nameâ í¨ìì ì´ë¦ì´ ì ì¥ë©ëë¤. ëê°ë í¨ì ì ì¸ë¶ìì ì´ë¦ì ê°ì ¸ì¤ëë°, ì ì¸ë¶ì ì´ë¦ì´ ìë ê²½ì°ì ìë°ì¤í¬ë¦½í¸ ìì§ì´ 컨í ì¤í¸(í ë¹ ë±)를 ì´ì©í´ ì´ë¦ì ì¶ë¡ í©ëë¤.lengthâ í¨ì ì ì¸ë¶ì ìë ì¸ìì ìë¡ ëë¨¸ì§ ë§¤ê°ë³ìë í¬í¨ëì§ ììµëë¤.
í¨ì ííìì¼ë¡ í¨ì를 ì ìíìëë° ì´ë¦ì´ ìë¤ë©´ ì´ë¥¼ ê¸°ëª í¨ì ííìì´ë¼ ë¶ë¦ ëë¤. ê¸°ëª í¨ì ííìì ì´ë¦ì ì¬ê· í¸ì¶ê³¼ ê°ì´ í¨ì ë´ë¶ìì ì기 ìì ì í¸ì¶íê³ ì í ë ì¬ì©í ì ììµëë¤.
í¨ìì ë¤ìí íë¡í¼í°ë¥¼ ì¶ê°í ì ììµëë¤. ë리 ì°ì´ë ìë°ì¤í¬ë¦½í¸ ë¼ì´ë¸ë¬ë¦¬ ìë¹ììì ì´ë° 커ì¤í íë¡í¼í°ë¥¼ ì íì©íê³ ììµëë¤.
ì´ë° ë¼ì´ë¸ë¬ë¦¬ë¤ì â주ìâ í¨ì íë를 ë§ë¤ê³ ì¬ê¸°ì ë¤ìí âí¬í¼â í¨ì를 ë¶ì´ë ìì¼ë¡ 구ì±ë©ëë¤. jQueryë ì´ë¦ì´ $ì¸ ì£¼ì í¨ìë¡ ì´ë£¨ì´ì ¸ ììµëë¤. lodashë 주ì í¨ì _ì _.clone, _.keyByë±ì íë¡í¼í°ë¥¼ ì¶ê°íë ìì¼ë¡ 구ì±ëì£ . ìì¸í ì ë³´ë lodash ê³µì 문ììì ì°¾ìë³¼ ì ììµëë¤. ì´ë ê² í¨ì íëì ë¤ìí í¬í¼ í¨ì를 ë¶ì¬ ë¼ì´ë¸ë¬ë¦¬ë¥¼ ë§ë¤ë©´ ë¼ì´ë¸ë¬ë¦¬ íëê° ì ì ë³ì íëë§ ì¬ì©íë¯ë¡ ì ì ê³µê°ì ëë½íì§ ìëë¤ë ì¥ì ì´ ììµëë¤. ì´ë¦ ì¶©ëë ë°©ì§í ì ìì£ .
ì´ë ê² ê°ì²´ë¡ìì í¨ì í¹ì§ì ì´ì©í´ 커ì¤í íë¡í¼í°ë¥¼ ë§ë¤ë©´ í¨ìë ì기 ìì ì ì´ì©í´ ìíë ì¼ì ìíí ì ìê³ , í¨ì ì기 ìì ì ë¸ë¦° íë¡í¼í°ì 기ë¥ë ì¬ì©í ì ìë¤ë ì¥ì ì´ ììµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.