ìë°ì¤í¬ë¦½í¸ë í¨ì를 ë¤ë£° ë íìí ì ì°ì±ì ì ê³µí©ëë¤. í¨ìë ì´ê³³ì ê³³ ì ë¬ë ì ìê³ , ê°ì²´ë¡ë ì¬ì©ë ì ììµëë¤. ì´ë² ì±í°ìì í¨ì ê°ì í¸ì¶ì ì´ë»ê² í¬ìë©(forwarding) íëì§, í¨ì를 ì´ë»ê² ë°ì½ë ì´í (decorating) íëì§ì ëí´ ììë³´ê² ìµëë¤.
ì½ë ë³ê²½ ìì´ ìºì± ê¸°ë¥ ì¶ê°í기
CPU를 ë§ì´ ì¡ì먹ì§ë§ ê²°ê³¼ë ìì ì ì¸ í¨ì slow(x)ê° ìë¤ê³ ê°ì í´ ë´
ìë¤. ê²°ê³¼ê° ìì ì ì´ë¼ë ë§ì xê° ê°ì¼ë©´ í¸ì¶ ê²°ê³¼ë ê°ë¤ë ê²ì ì미í©ëë¤.
slow(x)ê° ì주 í¸ì¶ëë¤ë©´, 결과를 ì´ëê°ì ì ì¥(ìºì±)í´ ì¬ì°ì°ì 걸리ë ìê°ì ì¤ì´ê³ ì¶ì ê²ëë¤.
ìë ìììì slow() ìì ìºì± ê´ë ¨ ì½ë를 ì¶ê°íë ëì , ëí¼ í¨ì를 ë§ë¤ì´ ìºì± 기ë¥ì ì¶ê°í ìì ì
ëë¤. ê³§ ì 리íê² ì§ë§, ì´ë ê² ëí¼ í¨ì를 ë§ë¤ë©´ ì¬ë¬ ê°ì§ ì´ì ì´ ììµëë¤.
ì½ë를 먼ì ì´í´ë´ ìë¤. ì¤ëª ì ìë쪽ì ì ì´ëììµëë¤.
function slow(x) {
// CPU ì§ì½ì ì¸ ìì
ì´ ì¬ê¸°ì ì¬ ì ììµëë¤.
alert(`slow(${x})ì/를 í¸ì¶í¨`);
return x;
}
function cachingDecorator(func) {
let cache = new Map();
return function(x) {
if (cache.has(x)) { // cacheì í´ë¹ í¤ê° ìì¼ë©´
return cache.get(x); // ëìíë ê°ì cacheìì ì½ì´ìµëë¤.
}
let result = func(x); // ê·¸ë ì§ ìì ê²½ì°ì func를 í¸ì¶íê³ ,
cache.set(x, result); // ê·¸ 결과를 ìºì±(ì ì¥)í©ëë¤.
return result;
};
}
slow = cachingDecorator(slow);
alert( slow(1) ); // slow(1)ì´ ì ì¥ëììµëë¤.
alert( "ë¤ì í¸ì¶: " + slow(1) ); // ëì¼í ê²°ê³¼
alert( slow(2) ); // slow(2)ê° ì ì¥ëììµëë¤.
alert( "ë¤ì í¸ì¶: " + slow(2) ); // ìì¤ê³¼ ëì¼í ê²°ê³¼
cachingDecoratorê°ì´ ì¸ìë¡ ë°ì í¨ìì íëì ë³ê²½ìì¼ì£¼ë í¨ì를 ë°ì½ë ì´í°(decorator) ë¼ê³ ë¶ë¦
ëë¤.
모ë í¨ì를 ëìì¼ë¡ cachingDecorator를 í¸ì¶ í ì ìëë°, ì´ë ë°íëë ê²ì ìºì± ëí¼ì
ëë¤. í¨ìì cachingDecorator를 ì ì©íê¸°ë§ íë©´ ìºì±ì´ ê°ë¥í í¨ì를 ìíë ë§í¼ 구íí ì ì기 ë문ì ë°ì½ë ì´í° í¨ìë ì주 ì ì©íê² ì¬ì©ë©ëë¤.
ìºì± ê´ë ¨ ì½ë를 í¨ì ì½ëì ë¶ë¦¬í ì ì기 ë문ì í¨ìì ì½ëê° ê°ê²°í´ì§ë¤ë ì¥ì ë ììµëë¤.
ìë 그림ìì ë³¼ ì ìë¯ì´ cachingDecorator(func)를 í¸ì¶íë©´ âëí¼(wrapper)â, function(x)ì´ ë°íë©ëë¤. ëí¼ function(x)ë func(x)ì í¸ì¶ 결과를 ìºì± ë¡ì§ì¼ë¡ ê°ìëë¤(wrapping).
ë°ê¹¥ ì½ëìì ë´¤ì ë, í¨ì slowë ëí¼ë¡ ê°ì¼ ì´ì ì´ë ì´íë ëì¼í ì¼ì ìíí©ëë¤. íë ììì ìºì± 기ë¥ì´ ì¶ê°ë ê²ë¿ì
ëë¤.
slow 본문ì ìì íë ê² ë³´ë¤ ë
립ë ëí¼ í¨ì cachingDecorator를 ì¬ì©í ë ì기ë ì´ì ì ì 리íë©´ ë¤ìê³¼ ê°ìµëë¤.
cachingDecorator를 ì¬ì¬ì© í ì ììµëë¤. ìíë í¨ì ì´ëìëcachingDecorator를 ì ì©í ì ììµëë¤.- ìºì± ë¡ì§ì´ ë¶ë¦¬ëì´
slowìì²´ì ë³µì¡ì±ì´ ì¦ê°íì§ ììµëë¤. - íìíë¤ë©´ ì¬ë¬ ê°ì ë°ì½ë ì´í°ë¥¼ ì¡°í©í´ì ì¬ì©í ìë ììµëë¤(ì¶ê° ë°ì½ë ì´í°ë
cachingDecoratorë¤ë¥¼ ë°ë¦ ëë¤).
'func.callâ를 ì¬ì©í´ 컨í ì¤í¸ ì§ì í기
ììì 구íí ìºì± ë°ì½ë ì´í°ë ê°ì²´ ë©ìëì ì¬ì©í기ì ì í©íì§ ììµëë¤.
ê°ì²´ ë©ìë worker.slow()ë ë°ì½ë ì´í° ì ì© í ì ëë¡ ëìíì§ ìì£ .
// worker.slowì ìºì± 기ë¥ì ì¶ê°í´ë´
ìë¤.
let worker = {
someMethod() {
return 1;
},
slow(x) {
// CPU ì§ì½ì ì¸ ìì
ì´ë¼ ê°ì
alert(`slow(${x})ì/를 í¸ì¶í¨`);
return x * this.someMethod(); // (*)
}
};
// ì´ì ê³¼ ëì¼í ì½ë
function cachingDecorator(func) {
let cache = new Map();
return function(x) {
if (cache.has(x)) {
return cache.get(x);
}
let result = func(x); // (**)
cache.set(x, result);
return result;
};
}
alert( worker.slow(1) ); // 기존 ë©ìëë ì ëìí©ëë¤.
worker.slow = cachingDecorator(worker.slow); // ìºì± ë°ì½ë ì´í° ì ì©
alert( worker.slow(2) ); // ìë¬ ë°ì!, Error: Cannot read property 'someMethod' of undefined
(*)ë¡ íìí ì¤ìì this.someMethod ì ê·¼ì ì¤í¨í기 ë문ì ìë¬ê° ë°ìíìµëë¤.
ìì¸ì (**)ë¡ íìí ì¤ìì ëí¼ê° 기존 í¨ì func(x)를 í¸ì¶íë©´ thisê° undefinedê° ë기 ë문ì
ëë¤.
ìë ì½ë를 ì¤íí´ë ë¹ì·í ì¦ìì´ ëíë©ëë¤.
let func = worker.slow;
func(2);
ëí¼ê° 기존 ë©ìë í¸ì¶ 결과를 ì ë¬íë ¤ íì§ë§ thisì 컨í
ì¤í¸ê° ì¬ë¼ì¡ê¸° ë문ì ìë¬ê° ë°ìíë ê²ì´ì£ .
ìë¬ê° ë°ìíì§ ìê² ì½ë를 ìì í´ ë´ ìë¤.
먼ì , this를 ëª
ìì ì¼ë¡ ê³ ì í´ í¨ì를 í¸ì¶í ì ìê² í´ì£¼ë í¹ë³í ë´ì¥ í¨ì ë©ìë func.call(context, â¦args)ì ëí´ ììë´
ìë¤.
문ë²ì ë¤ìê³¼ ê°ìµëë¤.
func.call(context, arg1, arg2, ...)
ë©ìë를 í¸ì¶íë©´ ë©ìëì 첫 ë²ì§¸ ì¸ìê° this, ì´ì´ì§ë ì¸ìê° funcì ì¸ìê° ë í, funcì´ í¸ì¶ë©ëë¤.
ìë í¨ìì ë©ìë를 í¸ì¶íë©´ ê±°ì ëì¼í ì¼ì´ ë°ìí©ëë¤.
func(1, 2, 3);
func.call(obj, 1, 2, 3)
ë ë¤ ì¸ìë¡ 1, 2, 3ì ë°ì£ . ì ì¼í ì°¨ì´ì ì func.callìì thisê° objë¡ ê³ ì ëë¤ë ì ì
ëë¤.
ë¤ë¥¸ 컨í
ì¤í¸(ë¤ë¥¸ ê°ì²´) íì sayHi를 í¸ì¶íë ìì를 ì´í´ë´
ìë¤. sayHi.call(user)를 í¸ì¶íë©´ sayHiì 컨í
ì¤í¸ê° this=userë¡, sayHi.call(admin)ì í¸ì¶íë©´ sayHiì 컨í
ì¤í¸ê° this=adminë¡ ì¤ì ë©ëë¤.
function sayHi() {
alert(this.name);
}
let user = { name: "John" };
let admin = { name: "Admin" };
// callì ì¬ì©í´ ìíë ê°ì²´ê° 'this'ê° ëëë¡ í©ëë¤.
sayHi.call( user ); // this = John
sayHi.call( admin ); // this = Admin
ìë ìììì callì ì¬ì©í´ 컨í
ì¤í¸ì phraseì ìíë ê°ì ì§ì í´ ë³´ììµëë¤.
function say(phrase) {
alert(this.name + ': ' + phrase);
}
let user = { name: "John" };
// thisì userê° ê³ ì ëê³ , "Hello"ë ë©ìëì 첫 ë²ì§¸ ì¸ìê° ë©ëë¤.
say.call( user, "Hello" ); // John: Hello
ëí¼ ììì callì ì¬ì©í´ 컨í
ì¤í¸ë¥¼ ì본 í¨ìë¡ ì ë¬íë©´ ìë¬ê° ë°ìíì§ ììµëë¤.
let worker = {
someMethod() {
return 1;
},
slow(x) {
alert(`slow(${x})ì/를 í¸ì¶í¨`);
return x * this.someMethod(); // (*)
}
};
function cachingDecorator(func) {
let cache = new Map();
return function(x) {
if (cache.has(x)) {
return cache.get(x);
}
let result = func.call(this, x); // ì´ì 'this'ê° ì ëë¡ ì ë¬ë©ëë¤.
cache.set(x, result);
return result;
};
}
worker.slow = cachingDecorator(worker.slow); // ìºì± ë°ì½ë ì´í° ì ì©
alert( worker.slow(2) ); // ì ëë¡ ëìí©ëë¤.
alert( worker.slow(2) ); // ì ëë¡ ëìí©ëë¤. ë¤ë§, ì본 í¨ìê° í¸ì¶ëì§ ìê³ ìºì ë ê°ì´ ì¶ë ¥ë©ëë¤.
ì´ì ìë¬ ìì´ ëª¨ë ê² ì ìì ì¼ë¡ ëìí©ëë¤.
ëª
íí ì´í´ë¥¼ ìí´ thisê° ì´ë¤ ê³¼ì ì ê±°ì³ ì ë¬ëëì§ ìì¸í ì´í´ë³´ê² ìµëë¤.
- ë°ì½ë ì´í°ë¥¼ ì ì©í íì
worker.slowë ëí¼function (x) { ... }ê° ë©ëë¤. worker.slow(2)를 ì¤ííë©´ ëí¼ë2를 ì¸ìë¡ ë°ê³ ,this=workerê° ë©ëë¤(ì ìì ê°ì²´).- ê²°ê³¼ê° ìºìëì§ ìì ìí©ì´ë¼ë©´
func.call(this, x)ìì íì¬this(=worker)ì ì¸ì(=2)를 ì본 ë©ìëì ì ë¬í©ëë¤.
ì¬ë¬ ì¸ì ì ë¬í기
cachingDecorator를 ì¢ ë ë¤ì±ë¡ê² í´ë´
ìë¤. ì§ê¸ ìíë¡ ì¸ìê° íëë¿ì¸ í¨ììë§ cachingDecorator를 ì ì©í ì ììµëë¤.
ë³µì ì¸ì를 ê°ì§ ë©ìë, worker.slow를 ìºì±íë ¤ë©´ ì´ë»ê² í´ì¼ í ì§ ìê°í´ ë´
ìë¤.
let worker = {
slow(min, max) {
return min + max; // CPU를 ì주 ë§ì´ ì°ë ìì
ì´ë¼ê³ ê°ì
}
};
// ëì¼í ì¸ì를 ì ë¬íì ë í¸ì¶ 결과를 기ìµí ì ìì´ì¼ í©ëë¤.
worker.slow = cachingDecorator(worker.slow);
ì§ê¸ê¹ì§ ì¸ìê° x íëë¿ì´ì기 ë문ì cache.set(x, result)ì¼ë¡ 결과를 ì ì¥íê³ cache.get(x)ì¼ë¡ ì ì¥ë 결과를 ë¶ë¬ì¤ê¸°ë§ íë©´ ëìµëë¤. ê·¸ë°ë° ì´ì ë¶í´ (min,max)ê°ì´ ì¸ìê° ì¬ë¬ ê°ì´ê³ , ì´ ì¸ìë¤ì ë겨 í¸ì¶í 결과를 기ìµí´ì¼ í©ëë¤. ë¤ì´í°ë¸ ë§µì ë¨ì¼ í¤ë§ ë°ì§ë§ ë§ì´ì£ .
í´ê²° ë°©ë²ì ì¬ë¬ ê°ì§ì ëë¤.
- ë³µì í¤ë¥¼ ì§ìíë 맵과 ì ì¬í ìë£ êµ¬ì¡° 구íí기(ìë íí° ë¼ì´ë¸ë¬ë¦¬ ë±ì ì¬ì©í´ë ë¨)
- ì¤ì²© ë§µì ì¬ì©í기.
(max, result)ì ì ì¥ìcache.set(min)ì¼ë¡,resultëcache.get(min).get(max)ì ì¬ì©í´ ì»ìµëë¤. - ë ê°ì íëë¡ í©ì¹ê¸°.
ë§µì í¤ë¡ 문ìì´"min,max"를 ì¬ì©í©ëë¤. ì¬ë¬ ê°ì íëë¡ í©ì¹ë ì½ëë í´ì± í¨ì(hashing function) ì 구íí´ ì ì°ì±ì ëì ëë¤.
ì¸ ë²ì§¸ ë°©ë²ë§ì¼ë¡ ì¶©ë¶í기 ë문ì ì´ ë°©ë²ì ì¬ì©í´ ì½ë를 ìì í´ ë³´ê² ìµëë¤.
ì¬ê¸°ì ëíì¬ func.call(this, x)를 func.call(this, ...arguments)ë¡ êµì²´í´, ëí¼ í¨ìë¡ ê°ì¼ í¨ìê° í¸ì¶ë ë ë³µì ì¸ì ë길 ì ìëë¡ íê² ìµëë¤.
ë ê°ë ¥í´ì§ cachingDecorator를 ì´í´ë´
ìë¤.
let worker = {
slow(min, max) {
alert(`slow(${min},${max})ì/를 í¸ì¶í¨`);
return min + max;
}
};
function cachingDecorator(func, hash) {
let cache = new Map();
return function() {
let key = hash(arguments); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, ...arguments); // (**)
cache.set(key, result);
return result;
};
}
function hash(args) {
return args[0] + ',' + args[1];
}
worker.slow = cachingDecorator(worker.slow, hash);
alert( worker.slow(3, 5) ); // ì ëë¡ ëìí©ëë¤.
alert( "ë¤ì í¸ì¶: " + worker.slow(3, 5) ); // ëì¼í ê²°ê³¼ ì¶ë ¥(ìºìë ê²°ê³¼)
ì´ì ì¸ìì ê°ìì ê´ê³ìì´ ëí¼ê° ì ëìí©ëë¤. í´ì í¨ìê° ë³µìì ì¸ì를 ìì ìì¬ë¡ ì²ë¦¬í ì ìëë¡ ìì ì í´ì¼ í긴 íì§ë§ ë§ì´ì£ . ì´ë¥¼ ê°ë¥íê² í´ì£¼ë í¥ë¯¸ë¡ì´ ë°©ë²ì ìëìì ìê°í´ ëë¦¬ê² ìµëë¤.
ê°ì í, ë°ë ê²ì ë ê°ì§ì ëë¤.
(*)ë¡ íìí ì¤ììhashê° í¸ì¶ëë©´ìarguments를 ì¬ì©í ë¨ì¼ í¤ê° ë§ë¤ì´ì§ëë¤. ì¬ê¸°ì ê°ë¨í âê²°í©â í¨ìë¡ ì¸ì(3, 5)를 í¤"3,5"ë¡ ë°ê¿¨ëë°, ì¢ ë ë³µì¡í ê²½ì°ë¼ë©´ ë ë¤ë¥¸ í´ì± í¨ìê° íìí ì ììµëë¤.(**)ë¡ íìí ì¤ììfunc.call(this, ...arguments)를 ì¬ì©í´ 컨í ì¤í¸(this)ì ëí¼ê° ê°ì§ ì¸ì ì ë¶(...arguments)를 기존 í¨ìì ì ë¬íììµëë¤.
func.apply
ê·¸ë°ë° ì¬ê¸°ì func.call(this, ...arguments) ëì , func.apply(this, arguments)를 ì¬ì©í´ë ë©ëë¤.
ë´ì¥ ë©ìë func.applyì 문ë²ì ë¤ìê³¼ ê°ìµëë¤.
func.apply(context, args)
applyë funcì this를 contextë¡ ê³ ì í´ì£¼ê³ , ì ì¬ ë°°ì´ ê°ì²´ì¸ args를 ì¸ìë¡ ì¬ì©í ì ìê² í´ì¤ëë¤.
callê³¼ applyì 문ë²ì ì°¨ì´ë callì´ ë³µì ì¸ì를 ë°ë¡ë°ë¡ ë°ë ëì applyë ì¸ì를 ì ì¬ ë°°ì´ ê°ì²´ë¡ ë°ëë¤ë ì ë¿ì
ëë¤.
ë°ë¼ì ìë ì½ë ë ì¤ì ê±°ì ê°ì ìí ì í©ëë¤.
func.call(context, ...args); // ì ê° êµ¬ë¬¸ì ì¬ì©í´ ì¸ìê° ë´ê¸´ ë°°ì´ì ì ë¬íë ê²ê³¼
func.apply(context, args); // callì ì¬ì©íë ê²ì ëì¼í©ëë¤.
ê·¸ë°ë° ì½ê°ì ì°¨ì´ê° ì긴 í©ëë¤.
- ì ê° êµ¬ë¬¸
...ì ì´í°ë¬ë¸argsì ë¶í´ í´callì ì ë¬í ì ìëë¡ í´ì¤ëë¤. applyë ì¤ì§ ì ì¬ ë°°ì´ ííìargsë§ ë°ìµëë¤.
ì´ ì°¨ì´ë§ 빼면 ë ë©ìëë ìì í ëì¼íê² ëìí©ëë¤. ì¸ìê° ì´í°ë¬ë¸ ííë¼ë©´ callì, ì ì¬ ë°°ì´ ííë¼ë©´ apply를 ì¬ì©íë©´ ë©ëë¤.
ë°°ì´ê°ì´ ì´í°ë¬ë¸ì´ë©´ì ì ì¬ ë°°ì´ì¸ ê°ì²´ì ë ë¤ë¥¼ ì¬ì©í ì ìëë°, ëë¶ë¶ì ìë°ì¤í¬ë¦½í¸ ìì§ì ë´ë¶ìì apply를 ìµì í í기 ë문ì apply를 ì¬ì©íë ê² ì¢ ë ë¹ ë¥´ê¸´ í©ëë¤.
ì´ë ê² ì»¨í ì¤í¸ì í¨ê» ì¸ì ì 체를 ë¤ë¥¸ í¨ìì ì ë¬íë ê²ì ì½ í¬ìë©(call forwarding) ì´ë¼ê³ í©ëë¤.
ê°ì¥ ê°ë¨í ííì ì½ í¬ìë©ì ë¤ìê³¼ ê°ìµëë¤.
let wrapper = function() {
return func.apply(this, arguments);
};
ì´ë° ìì¼ë¡ ì¸ë¶ìì wrapper를 í¸ì¶íë©´, 기존 í¨ìì¸ func를 í¸ì¶íë ê²ê³¼ ëª
ííê² êµ¬ë¶í ì ììµëë¤.
ë©ìë ë¹ë¦¬ê¸°
ììì 구íí í´ì± í¨ì를 ê°ì í´ë´ ìë¤.
function hash(args) {
return args[0] + ',' + args[1];
}
ì§ê¸ ìíìì ì¸ì ë ê°ë§ ë¤ë£° ì ììµëë¤. argsì ìì ê°ìì ìê´ìì´ ììë¤ì í©ì¹ ì ìì¼ë©´ ë ì¢ê² ë¤ì.
ê°ì¥ ìì°ì¤ë¬ì´ í´ê²°ì± ì ë°°ì´ ë©ìë arr.joinì ì¬ì©íë ê²ì ëë¤.
function hash(args) {
return args.join();
}
ê·¸ë°ë° ìì½ê²ë ì´ ë°©ë²ì ëìíì§ ììµëë¤. hash(arguments)를 í¸ì¶í ë ì¸ìë¡ ë겨주ë argumentsë ì§ì§ ë°°ì´ì´ ìëê³ ì´í°ë¬ë¸ ê°ì²´ë ì ì¬ ë°°ì´ ê°ì²´ì´ê¸° ë문ì
ëë¤.
ë°°ì´ì´ ìë ê²ì joinì í¸ì¶íë©´ ìë¬ê° ë°ìí©ëë¤.
function hash() {
alert( arguments.join() ); // Error: arguments.join is not a function
}
hash(1, 2);
ê·¸ë°ë° ìëì ê°ì ë°©ë²ì ì¬ì©íë©´ ë°°ì´ ë©ìë joinì ì¬ì©í ì ììµëë¤.
function hash() {
alert( [].join.call(arguments) ); // 1,2
}
hash(1, 2);
The trick is called method borrowing.
ì¼ë° ë°°ì´ìì join ë©ìë를 ë¹ë ¤ì¤ê³ ([].join), [].join.call를 ì¬ì©í´ arguments를 컨í
ì¤í¸ë¡ ê³ ì í í joinë©ìë를 í¸ì¶íë ê²ì´ì£ .
ì´ê² ì´ë»ê² ê°ë¥í ê¹ì?
ë¤ì´í°ë¸ ë©ìë arr.join(glue)ì ë´ë¶ ìê³ ë¦¬ì¦ì ì주 ê°ë¨í기 ë문ì
ëë¤.
ì¤íì âê·¸ëë¡â ì°¨ì©í´ ì¤ëª í´ ë³´ê² ìµëë¤.
glueê° ì²« ë²ì§¸ ì¸ìê° ëëë¡ í©ëë¤. ì¸ìê° ìì¼ë©´","ê° ì²« ë²ì§¸ ì¸ìê° ë©ëë¤.resultë ë¹ ë¬¸ìì´ì´ ëëë¡ ì´ê¸°íí©ëë¤.this[0]ìresultì ë§ë¶ì ëë¤.glueìthis[1]를resultì ë§ë¶ì ëë¤.glueìthis[2]를resultì ë§ë¶ì ëë¤.this.lengthê°ì íëª©ì´ ëª¨ë ì¶ê°ë ëê¹ì§ ì´ ì¼ì ë°ë³µí©ëë¤.result를 ë°íí©ëë¤.
기존ì callì ì¬ì©íë ë°©ìì²ë¼ this를 ë°ê³ this[0], this[1] ë±ì´ í©ì³ì§ëë¤. ì´ë ê² ë´ë¶ ìê³ ë¦¬ì¦ì´ 구íëì´ì기 ë문ì ì´ë¤ ì ì¬ ë°°ì´ì´ë thisê° ë ì ììµëë¤. ìë¹ìì ë©ìëê° ì´ë° ê´ìµì ë°ë¥´ê³ ìì£ . thisì argumentsê° í ë¹ëëë¼ë ì ëìíë ì´ì ê° ì¬ê¸°ì ììµëë¤.
ë°ì½ë ì´í°ì í¨ì íë¡í¼í°
í¨ì ëë ë©ìë를 ë°ì½ë ì´í°ë¡ ê°ì¸ ëì²´íë ê²ì ëì²´ì ì¼ë¡ ìì í©ëë¤. ê·¸ë°ë° ì본 í¨ìì func.calledCount ë±ì íë¡í¼í°ê° ìì¼ë©´ ë°ì½ë ì´í°ë¥¼ ì ì©í í¨ììì íë¡í¼í°ë¥¼ ì¬ì©í ì ìì¼ë¯ë¡ ìì íì§ ììµëë¤. í¨ìì íë¡í¼í°ê° ìë ê²½ì°ì ë°ì½ë ì´í° ì¬ì©ì 주ìí´ì¼ í©ëë¤.
ì ìììì í¨ì slowì íë¡í¼í°ê° ììë¤ë©´ cachingDecorator(slow) í¸ì¶ ê²°ê³¼ì¸ ëí¼ì íë¡í¼í°ê° ìê² ì£ .
ëªëª ë°ì½ë ì´í°ë ìì ë§ì íë¡í¼í°ë¥¼ ê°ê¸°ë í©ëë¤. ë°ì½ë ì´í°ë í¨ìê° ì¼ë§ë ë§ì´ í¸ì¶ëìëì§ ì¸ê±°ë í¸ì¶ ì ì¼ë§ë ë§ì ìê°ì´ ì모ëìëì§ ë±ì ì 보를 ëí¼ì íë¡í¼í°ì ì ì¥í ì ììµëë¤.
í¨ì íë¡í¼í°ì ì ê·¼í ì ìê² í´ì£¼ë ë°ì½ë ì´í°ë¥¼ ë§ëë ë°©ë²ë ììµëë¤. ê·¸ë°ë° ì´ê±¸ 구ííë ¤ë©´ Proxyë¼ë í¹ë³í ê°ì²´ë¥¼ ì¬ì©í´ í¨ì를 ê°ì¸ì¼ í©ëë¤. Proxyì ëí´ì Proxyì Reflectìì ë¤ë£¨ëë¡ íê² ìµëë¤.
ìì½
ë°ì½ë ì´í°ë í¨ì를 ê°ì¸ë ëí¼ë¡ í¨ìì íëì ë³íìíµëë¤. 주ì ìì ì ì¬ì í í¨ììì ì²ë¦¬í©ëë¤.
ë°ì½ë ì´í°ë í¨ìì ì¶ê°ë â기ë¥â í¹ì âì(ç¸, aspect)â ì ëë¡ ë³´ìë©´ ë©ëë¤. íë í¹ì ì¬ë¬ ê°ì ë°ì½ë ì´í°ë¥¼ ì¶ê°í´ë í¨ìì ì½ëë ë³ê²½ëì§ ììµëë¤.
cachingDecoratorë ìëì ê°ì ë©ìë를 ì¬ì©í´ 구ííììµëë¤.
- func.call(context, arg1, arg2â¦) â 주ì´ì§ 컨í
ì¤í¸ì ì¸ì를 ì¬ì©í´
func를 í¸ì¶í©ëë¤. - func.apply(context, args) â
thisìcontextê° í ë¹ëê³ , ì ì¬ ë°°ì´argsê° ì¸ìë¡ ì ë¬ëì´funcì´ í¸ì¶ë©ëë¤.
ì½ í¬ìë©ì ëê° apply를 ì¬ì©í´ 구íí©ëë¤.
let wrapper = function() {
return original.apply(this, arguments);
};
í¹ì ê°ì²´ìì ë©ìë를 ê°ì ¸ì¤ê³ , ë¤ë¥¸ ê°ì²´ë¥¼ 컨í
ì¤í¸ë¡ ê³ ì í í í¨ì를 í¸ì¶(call)íë ííì¸ ë©ìë ë¹ë¦¬ê¸°ì ëí ìì ë ì´í´ë³´ììµëë¤. ë©ìë ë¹ë¦¬ê¸°ë ë°°ì´ ë©ìë를 ë¹ë ¤ì ì´ë¥¼ argumentsì ì ì©í ë íí ì¬ì©ë©ëë¤. ëë¨¸ì§ ë§¤ê°ë³ìì ë°°ì´ì í¨ê» ì¬ì©íë©´ ì ì¬í 기ë¥ì 구íí ì ììµëë¤.
ë°ì½ë ì´í°ë¥¼ ì¬ì©í´ì 기ë¥ì 구íí ì¬ë¡ë¤ì´ ë§ìµëë¤. ìë 문ì ë¤ì íì´ë³´ë©´ì ë°ì½ë ì´í°ì ëí´ ì¼ë§ë ì´í´íê³ ìëì§ íì¸í´ë´ ìë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.