ØªÙØ¯ÙÙ ÙÙØ§ ÙØºØ© Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ٠رÙÙØ© عاÙÙØ© ØºÙØ± ٠سبÙÙØ© ÙÙ Ø§ÙØªØ¹Ø§Ù ٠٠ع Ø§ÙØ¯ÙØ§ÙØ إذ ÙÙ ÙÙÙØ§ ØªÙ Ø±ÙØ±Ùا أ٠استع٠اÙÙØ§ عÙ٠أÙÙÙØ§ ÙØ§Ø¦Ùات. ÙØ§ÙØ¢Ù Ø³ÙØ±Ù ÙÙÙ ÙÙÙ Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª بÙÙÙØ§ ÙÙÙÙ ÙÙØ²Ø®Ø±ÙÙÙØ§.
Ø®Ø¨ÙØ¦Ø© Ù Ù Ø®ÙÙ Ø§ÙØ³ØªØ§Ø±
ÙÙÙ٠بأÙ٠أÙ
اÙ
ÙØ§ Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ«ÙÙÙØ© عÙ٠اÙÙ
Ø¹Ø§ÙØ¬ âslow(x)â Ø¨ÙÙÙ
ا ÙØªØ§Ø¦Ø¬Ùا Ù
Ø³ØªÙØ±Ø©Ø Ø£Ù ÙÙÙ٠بأÙÙÙØ§ ÙÙ Ù
Ø±ÙØ±Ùا ذات âxâØ ÙØ³Ùجد ذات اÙÙØªÙجة دÙÙ
ÙØ§.
Ù٠استدعÙÙØ§ ÙØ°Ù Ø§ÙØ¯Ø§ÙØ© Ù Ø±Ø§Ø±ÙØ§ ÙØªÙØ±Ø§Ø±ÙØ§Ø ÙØ§ÙØ£ÙØ¶Ù ÙÙ Ø®Ø¨ÙØ¦Ùا (أ٠تذÙÙØ±Ùا) ÙØ§ØªØ¬Ùا ÙØ¦Ùا ÙØ°Ùب اÙÙÙØª سدÙÙ ÙØ¥Ø¬Ø±Ø§Ø¡ ذات Ø§ÙØØ³Ø§Ø¨Ø§Øª.
ÙÙÙÙØ Ø¨Ø¯Ù Ø¥Ø¶Ø§ÙØ© ÙØ°Ù اÙÙ
ÙØ²Ø© ÙÙ Ø¯Ø§ÙØ© âslow()â ÙÙØ³ÙØ§Ø Ø³ÙÙÙØ´Ø¦ Ø¯Ø§ÙØ© غاÙÙÙØ© ØªÙØ¶ÙÙ Ù
ÙØ²Ø© Ø§ÙØ®Ø¨Ùئة ÙØ°Ù. Ø³ÙØ±Ù أسÙÙÙ Ù
د٠ÙÙØ§Ø¦Ø¯ ÙØ°Ø§ Ø§ÙØ£Ù
ر.
Ø¥ÙÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø£ÙÙÙØ§Ø ÙØ¨Ø¹Ø¯Ùا Ø§ÙØ´Ø±Ø:
function slow(x) {
// ÙÙØ§ Ù
ÙÙ
ÙØ© Ø«ÙÙÙØ© تÙÙÙ٠اÙÙ
Ø¹Ø§ÙØ¬
alert(`âCalled with ${x}â`);
return x;
}
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;
};
}
slow = cachingDecorator(slow);
alert( slow(1) ); // slow(1) is cached and the result returned
alert( "Again: " + slow(1) ); // slow(1) result returned from cache
alert( slow(2) ); // slow(2) is cached and the result returned
alert( "Again: " + slow(2) ); // slow(2) result returned from cache
ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø£Ø¹ÙØ§ÙØ ÙØ¯Ø¹Ù âcachingDecoratorâ Ø¨Ø§ÙÙ
ÙØ²Ø®Ø±ÙÙ (decorator): ÙÙÙ Ø¯Ø§ÙØ© Ø®Ø§ØµÙØ© تأخذ Ø¯Ø§ÙØ© أخر٠Ù
ÙØ¹Ø§Ù
ÙÙØ§ ÙØªØ¹Ø¯Ù٠عÙ٠سÙÙÙÙØ§.
اÙÙÙØ±Ø© ÙÙØ§ Ù٠استدعاء âcachingDecoratorâ ÙØ£ÙÙ Ø¯Ø§ÙØ© Ø£Ø±Ø¯ÙØ§Ø ÙØ³ØªÙØ¹ÙØ¯ ÙÙØ§ غÙÙØ§Ù Ø§ÙØ®Ø¨Ùئة ذاÙ. اÙÙÙØ±Ø© ÙØ°Ù رائعة إذ ÙÙ
Ù٠أ٠ÙÙÙ٠أÙ
اÙ
Ù
ئات Ù
Ù Ø§ÙØ¯ÙØ§Ù Ø§ÙØªÙ ÙÙ
Ù٠أ٠تستغÙÙ ÙØ°Ù اÙÙ
ÙØ²Ø©Ø ÙÙÙÙ Ù
ا عÙÙÙØ§ ÙØ¹ÙÙ ÙÙ Ø¥Ø¶Ø§ÙØ© âcachingDecoratorâ Ø¹ÙÙÙØ§.
Ù٠ا ÙØ£ÙÙØ§ ÙØØ§ÙØ¸ عÙÙ Ø§ÙØ´ÙÙØ±Ø© أبسط Ø¨ÙØµÙ Ù ÙØ²Ø© Ø§ÙØ®Ø¨Ùئة ع٠٠ÙÙ ÙØ© Ø§ÙØ¯Ø§ÙØ© اÙÙØ¹ÙÙØ©.
ÙØ§ØªØ¬ âcachingDecorator(func)â Ù٠«غÙÙØ§Ù» ÙÙØ¹Ùد Ø§ÙØ¯Ø§ÙØ© âfunction(x)â Ø§ÙØªÙ Â«ØªÙØºÙÙÙ» استدعاء âfunc(x)â Ø¯Ø§Ø®Ù Ø´ÙÙØ±Ø© Ø§ÙØ®Ø¨Ùئة:
[decorator-makecaching-wrapper.png]
Ø§ÙØ´ÙÙØ±Ø§Øª Ø§ÙØ®Ø§Ø±Ø¬ÙØ© ÙØ§ تر٠أÙ٠تغÙÙØ± عÙÙ Ø¯Ø§ÙØ© âslowâ Ø§ÙÙ
ÙØºÙÙÙØ©. Ù
ا ÙØ¹ÙÙØ§Ù ÙÙ ØªØ¹Ø²ÙØ² سÙÙÙÙØ§ بÙ
ÙØ²Ø© Ø§ÙØ®Ø¨Ùئة.
Ø¥Ø°ÙØ§ ÙÙÙØ®Ùص: Ø«Ù
ÙØ© ÙÙØ§Ø¦Ø¯ Ø¹Ø¯ÙØ© ÙØ§Ø³ØªØ¹Ù
ا٠âcachingDecoratorâ Ù
ÙÙØµÙÙØ§ بد٠تعدÙÙ Ø´ÙÙØ±Ø© Ø§ÙØ¯Ø§ÙØ© âslowâ ÙÙØ³Ùا:
- إعادة استعÙ
اÙ
âcachingDecoratorâØ ÙÙÙØ¶ÙÙ٠عÙÙ Ø¯ÙØ§Ù أخرÙ. - ÙØµÙ Ø´ÙÙØ±Ø© Ø§ÙØ®Ø¨Ùئة ÙÙØ§ ØªØ²ÙØ¯ Ù
٠تعÙÙØ¯ Ø¯Ø§ÙØ©
âslowâÙÙØ³Ùا (ÙØ°Ø§ ÙÙ ÙØ§Ùت ٠عÙÙØ¯Ø©). - Ø¥Ù ÙØ§ÙÙØ© Ø¥Ø¶Ø§ÙØ© Ø£ÙØ«Ø± Ù Ù Ù ÙØ²Ø®Ø±Ù Ø¹ÙØ¯ Ø§ÙØØ§Ø¬Ø© (Ø³ÙØ±Ù ذÙÙ ÙØ§ØÙÙØ§).
استعÙ
ا٠âfunc.callâ ÙØ£Ø®Ø° Ø§ÙØ³ÙاÙ
ÙØ§ ÙÙÙØ¹ Ù ÙØ²Ø®Ø±ÙÙ Ø§ÙØ®Ø¨Ùئة Ø§ÙØ°Ù شرØÙا٠٠ع ØªÙØ§Ø¨Ùع اÙÙØ§Ø¦Ùات.
ÙÙ
Ø«ÙÙØ§ ÙÙ Ø§ÙØ´ÙÙØ±Ø© أسÙÙÙØ Ø³ÙØªÙÙÙ٠عÙ
Ù âworker.slow()â Ø¨Ø¹Ø¯ ÙØ°Ù Ø§ÙØ²Ø®Ø±ÙØ©:
// â«ÙÙÙØ§ ÙÙØ¶Ù Ù
ÙØ²Ø© Ø§ÙØ®Ø¨Ùئة Ø¥ÙÙ worker.slow
let worker = {
someMethod() {
return 1;
},
slow(x) {
// Ø£Ù
اÙ
ÙØ§ Ù
ÙÙ
ÙØ© Ø«ÙÙÙØ© عÙ٠اÙÙ
Ø¹Ø§ÙØ¬ ÙÙØ§
alert("Called with " + 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) ); // â«Ùاااا! خطأ: ØªØ¹Ø°ÙØ±Øª ÙØ±Ø§Ø¡Ø© Ø§ÙØ®Ø§ØµÙØ© 'someMethod' ÙÙ undefined
Ù
ÙØ§Ù Ø§ÙØ®Ø·Ø£ ÙÙ Ø§ÙØ³Ø·Ø± â(*)â Ø§ÙØ°Ù ÙØØ§Ù٠اÙÙØµÙ٠إÙÙ âthis.someMethodâ ÙÙÙØ´Ù ÙØ´ÙÙØ§ Ø°Ø±ÙØ¹Ùا. ÙÙ ØªØ¹Ø±Ù Ø§ÙØ³Ø¨Ø¨Ø
Ø§ÙØ³Ø¨Ø¨ Ù٠أÙÙ Ø§ÙØºÙÙØ§Ù ÙØ³ØªØ¯Ø¹Ù Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£ØµÙÙØ© ÙÙØ°Ø§ âfunc(x)â ÙÙ Ø§ÙØ³Ø·Ø± â(**)â. ÙØÙÙ ÙØ³ØªØ¯Ø¹ÙÙØ§ ÙÙØ°Ø§ تستÙÙ
Ø§ÙØ¯Ø§ÙØ© âthis = undefinedâ.
Ø³ÙØ±Ù ٠ا ÙØ´Ø¨Ù ÙØ°Ø§ Ø§ÙØ®Ø·Ø£ Ù٠شغÙÙÙØ§ ÙØ°Ù Ø§ÙØ´ÙÙØ±Ø©:
let func = worker.slow;
func(2);
Ø¥Ø°ÙØ§â¦ ÙÙÙ
Ø±ÙØ± Ø§ÙØºÙÙØ§Ù Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø¥ÙÙ Ø§ÙØªØ§Ø¨Ùع Ø§ÙØ£ØµÙ٠دÙÙ Ø§ÙØ³Ùا٠âthisâØ Ø¨ÙØ°Ø§ ÙØØµÙ Ø§ÙØ®Ø·Ø£.
ÙÙØª Ø§ÙØ¥ØµÙاØ.
Ø«Ù ÙØ© ØªØ§Ø¨ÙØ¹ Ø¯ÙØ§Ù ٠ض٠ÙÙ Ù٠اÙÙØºØ© باس٠func.call(context, â¦args) ÙØªÙØ ÙÙØ§ استدعاء Ø§ÙØ¯Ø§ÙØ©
ØµÙØ§ØºØªÙ ÙÙ:
func.call(context, arg1, arg2, ...)
ÙÙØ´ØºÙÙ Ø§ÙØªØ§Ø¨Ùع Ø§ÙØ¯Ø§Ùة٠âfuncâ Ø¨Ø¹Ø¯ تÙ
Ø±ÙØ± اÙÙ
ÙØ¹Ø§Ù
Ù Ø§ÙØ£ÙÙ (ÙÙÙ âthisâ) ÙØ«Ù
Ù Ù
ÙØ¹Ø§Ù
ÙØ§ØªÙا.
ÙÙØªØ¨Ø³ÙØ·Ø ÙØ°ÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ÙÙ ÙØ§ ÙÙØ±ÙØ§Ù Ø¨Ø´ÙØ¡ ÙÙ Ø§ÙØªÙÙÙØ°:
func(1, 2, 3);
func.call(obj, 1, 2, 3)
ÙÙÙØ§ÙÙ
ا ÙØ³ØªØ¯Ø¹Ù âfuncâ Ø¨Ø§ÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª â1â Ùâ2â Ùâ3â. اÙÙØ±Ù اÙÙØÙØ¯ Ù٠أÙÙ âfunc.callâ ØªØ¶Ø¨Ø· ÙÙÙ
Ø© âthisâ Ø¹ÙÙ âobjâ Ø¹ÙØ§ÙØ©Ù عÙ٠ذÙÙ.
ÙÙØ£Ø®Ø° Ù
ثاÙÙØ§. ÙÙ Ø§ÙØ´ÙÙØ±Ø© أسÙÙÙ ÙØ³ØªØ¯Ø¹Ù âsayHiâ Ø¨Ø³ÙØ§Ù ÙØ§Ø¦Ùات أخرÙ: ÙÙØ´ØºÙÙ âsayHi.call(user)â Ø§ÙØ¯Ø§ÙØ©Ù âsayHiâ ÙÙÙÙ
Ø±ÙØ± âthis=userâØ Ø«Ù
Ù ÙÙ Ø§ÙØ³Ø·Ø± Ø§ÙØªØ§ÙÙ ÙØ¶Ø¨Ø· â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â ÙØªØ³ØªØ¯Ø¹Ù âsayâ Ø¨Ø§ÙØ³ÙØ§Ù ÙØ§Ùعبارة اÙÙ
ÙÙ
Ø±ÙØ±ØªÙÙ:
function say(phrase) {
alert(this.name + ': ' + phrase);
}
let user = { name: "John" };
// â«Ø§ÙÙØ§Ø¦Ù user ÙØµÙر this ÙØªØµÙر Hello اÙÙ
ÙØ¹Ø§Ù
Ù Ø§ÙØ£ÙÙ
say.call( user, "Hello" ); // John: Hello
ÙÙ ØØ§ÙØªÙØ§ ÙØÙØ ÙÙ
Ù٠استعÙ
ا٠âcallâ ÙÙ Ø§ÙØºÙÙØ§Ù ÙÙÙÙ
Ø±ÙØ± Ø§ÙØ³Ùا٠إÙÙ Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£ØµÙÙØ©:
let worker = {
someMethod() {
return 1;
},
slow(x) {
alert("Called with " + 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â) â ÙÙÙ٠إÙÙ Ø§ÙØªØ§Ø¨Ùع Ø§ÙØ£ØµÙÙ.
استعÙ
Ø§Ù Ø£ÙØ«Ø± Ù
Ù ÙØ³ÙØ· داخ٠func.apply
Ø§ÙØ¢Ù صار ÙÙØª تعÙ
ÙÙ
âcachingDecoratorâ Ø¹ÙÙ Ø§ÙØ¹Ø§ÙÙ
. ÙÙÙØ§ Ø¥ÙÙ ÙÙØ§ ÙØ³ØªØ¹Ù
ÙÙØ§ Ù
ع Ø§ÙØ¯ÙØ§Ù Ø§ÙØªÙ تأخذ Ù
ÙØ¹Ø§Ù
ÙÙØ§ ÙØ§ØØ¯Ùا ÙÙØ·.
ÙÙ
اذا ÙÙ Ø£Ø±Ø¯ÙØ§ تخبئة Ø§ÙØªØ§Ø¨Ùع âworker.slowâ Ø§ÙØ°Ù ÙØ£Ø®Ø° Ø£ÙØ«Ø± Ù
Ù Ù
ÙØ¹Ø§Ù
ÙØ
let worker = {
slow(min, max) {
return min + max; // ÙÙØ¹Ø¯ÙÙØ§ عÙ
ÙÙØ© ØªØ³ØªÙØ²Ù اÙÙ
Ø¹Ø§ÙØ¬
}
};
// عÙÙÙØ§ تذÙÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª بÙÙØ³ اÙÙ
ÙØ¹Ø§Ù
Ù ÙÙØ§
worker.slow = cachingDecorator(worker.slow);
ÙÙÙØ§ سابÙÙØ§ ÙØ³ØªØ¹Ù
Ù âcache.set(x, result)â (ØÙ٠تعاÙ
ÙÙØ§ Ù
ع اÙÙ
ÙØ¹Ø§Ù
٠اÙÙØÙØ¯ âxâ) ÙÙØÙØ¸ اÙÙØ§ØªØ¬Ø ÙÙØ³ØªØ¹Ù
Ù âcache.get(x)â ÙÙØ¬Ùب اÙÙØ§ØªØ¬. Ø£Ù
ÙØ§ Ø§ÙØ¢Ù ÙØ¹ÙÙÙØ§ تذÙÙØ± ÙØ§ØªØ¬ Ù
جÙ
ÙØ¹Ø© Ù
ÙØ¹Ø§Ù
ÙØ§Øª â(min,max)â. Ø§ÙØ®Ø§Ø±Ø·Ø© âMapâ ÙØ§ تأخذ اÙÙ
ÙØ§ØªÙØ Ø¥ÙÙØ§ بÙÙÙ
Ø© ÙØ§ØØ¯Ø©.
Ø«Ù ÙØ© Ø£Ù Ø§Ù ÙØ§ Ø£ÙØ«Ø± Ù Ù ØÙÙ:
- ÙØªØ§Ø¨Ø© بÙÙØ© Ø¨ÙØ§Ùات Ø¬Ø¯ÙØ¯Ø© ØªØ´Ø¨Ù Ø§ÙØ®Ø±Ø§Ø¦Ø· (Ø£Ù Ø§Ø³ØªØ¹Ù Ø§Ù ÙØ§ØØ¯Ø© Ù Ù Ø·Ø±Ù Ø«Ø§ÙØ«) ÙÙ Ù٠استع٠اÙÙØ§ ÙØ£Ùثر ٠٠أ٠ر ÙØªØ³Ù Ø ÙÙØ§ بتخزÙÙ Ø£ÙØ«Ø± Ù Ù Ù ÙØªØ§Ø.
- استعÙ
Ø§Ù Ø§ÙØ®Ø±Ø§Ø¦Ø· اÙÙ
ØªØ¯Ø§Ø®ÙØ©: ØªØµÙØ±
âcache.set(min)âØ®Ø§Ø±Ø·Ø© ØªÙØ®Ø²ÙÙ Ø§ÙØ²ÙجÙÙâ(max, result)â. ÙÙÙ ÙÙ Ø£Ù ÙØ£Ø®Ø° اÙÙØ§ØªØ¬âresultâØ¨Ø§Ø³ØªØ¹Ù Ø§Ùâcache.get(min).get(max)â. - دÙ
ج اÙÙÙÙ
تÙÙ ÙÙ ÙØ§ØØ¯Ø©. ÙÙ ØØ§ÙØªÙØ§ ÙØ°Ù ÙÙ
Ù٠استعÙ
Ø§Ù Ø§ÙØ³ÙØ³ÙØ© اÙÙØµÙØ©
â"min,max"âÙØªÙÙÙ Ù ÙØªØ§ØâMapâ. ÙÙÙ Ù٠أ٠ÙÙØ¯ÙÙ ÙÙÙ ÙØ²Ø®Ø±ÙÙ Ø¯Ø§ÙØ© عÙÙÙØ© Hashing ÙÙ ÙÙÙØ§ ØµÙØ§Ø¹Ø© ÙÙÙ Ø© Ù Ù Ø£ÙØ«Ø± Ù Ù ÙÙÙ Ø©Ø ÙÙØµÙر Ø§ÙØ£Ù ر أسÙÙ.
Ø£ØºÙØ¨ Ø§ÙØªØ·Ø¨ÙÙØ§Øª Ø§ÙØ¹Ù ÙÙØ© ØªÙØ¹Ø¯Ù Ø§ÙØÙ Ø§ÙØ«Ø§ÙØ« ÙØ§ÙÙÙØ§Ø ÙÙÙØ°Ø§ Ø³ÙØ³ØªØ¹Ù ÙÙ ÙÙØ§.
عÙÙÙØ§ Ø£ÙØ¶Ùا Ø§Ø³ØªØ¨Ø¯Ø§Ù Ø§ÙØªØ§Ø¨Ùع âfunc.call(this, x)â Ø¨Ø§ÙØªØ§Ø¨ÙØ¹ âfunc.call(this, ...arguments)â ÙÙ ÙÙÙ
Ø±ÙØ± ÙÙ٠اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª Ø¥Ù٠استدعاء Ø§ÙØ¯Ø§ÙØ© اÙÙ
ÙØºÙÙÙØ© ÙØ§ Ø§ÙØ£ÙÙÙ ÙÙØ·.
رØÙب باÙÙ
ÙØ²Ø®Ø±Ù âcachingDecoratorâ Ø§ÙØ¬Ø¯ÙØ¯Ø Ø£ÙØ«Ø± ÙÙØ© ÙØ£ÙØ§ÙØ©:
let worker = {
slow(min, max) {
alert(`âCalled with ${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( "Again " + worker.slow(3, 5) ); // â«ÙÙØ³ اÙÙØ§ØªØ¬ (Ø®Ø¨ÙØ£ÙاÙ)
Ø§ÙØ¢Ù صار ÙØ¹Ù Ù Ù Ù٠ا ÙØ§Ù عدد اÙÙ ÙØ¹Ø§Ù ÙØ§Øª (ÙÙÙ٠عÙÙÙØ§ تعدÙÙ Ø¯Ø§ÙØ© Ø§ÙØ¹ÙÙÙØ© ÙØªØ³Ù Ø ÙÙ Ø£ÙØ¶Ùا باÙÙ ÙØ¹Ø§Ù ÙØ§Øª Ø£ÙÙØ§ ÙØ§Ù Ø¹Ø¯Ø¯ÙØ§. Ø³ÙØ´Ø±Ù أسÙÙÙ Ø¥ØØ¯Ù Ø§ÙØ·Ø±Ø§Ø¦Ù Ø§ÙØ¬Ù ÙÙØ© ÙØ¥Ùجاز ÙØ°Ù اÙÙ ÙÙ Ø©).
Ø£Ù Ø§Ù ÙØ§ تعدÙÙØ§Ù Ø§Ø«ÙØ§Ù:
- ÙÙ Ø§ÙØ³Ø·Ø±
â(*)âØ ÙØ³ØªØ¯Ø¹ÙâhashâÙØªØµÙع Ù ÙØªØ§ØÙا ÙØ§ØØ¯Ùا Ù Ùâargumentsâ. ÙØ³ØªØ¹Ù Ù ÙÙØ§ Ø¯Ø§ÙØ© «د٠ج» Ø¨Ø³ÙØ·Ø© تØÙÙ٠اÙÙ ÙØ¹Ø§Ù ÙØ§Ùâ(3, 5)âØ¥Ù٠اÙÙ ÙØªØ§Øâ"3,5"â. ÙÙ ÙØ§Ùت Ø§ÙØØ§ÙØ© ÙØ¯ÙÙ Ø£ÙØ«Ø± تعÙÙØ¯ÙØ§Ø ÙØªØØªØ§Ø¬ Ø¥ÙÙ Ø¯ÙØ§Ù عÙÙÙØ© أخرÙ. - Ø«Ù
Ù ÙØ³ØªØ¹Ù
Ù
â(**)âØ§ÙØªØ§Ø¨Ùعâfunc.call(this, ...arguments)âÙØªÙ Ø±ÙØ± Ø§ÙØ³Ùا٠ÙÙÙ٠اÙÙ ÙØ¹Ø§Ù ÙØ§Øª Ø§ÙØªÙ استÙÙ ÙØ§ Ø§ÙØºÙÙØ§Ù (ÙÙÙØ³ Ø§ÙØ£ÙÙ ÙÙØ·) â ÙÙ٠إÙÙ Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£ØµÙÙØ©.
ÙÙ
ÙÙÙØ§ بد٠استعÙ
ا٠âfunc.call(this, ...arguments)â Ø§Ø³ØªØºÙا٠âfunc.apply(this, arguments)â.
ØµÙØ§ØºØ© ÙØ°Ø§ Ø§ÙØªØ§Ø¨Ùع اÙ٠بÙÙ Ù٠اÙÙØºØ© func.apply ÙÙ:
func.apply(context, args)
ÙÙØ´ØºÙÙ Ø§ÙØªØ§Ø¨Ùع Ø§ÙØ¯Ø§Ùة٠âfuncâ Ø¨Ø¶Ø¨Ø· âthis=contextâ ÙØ§Ø³ØªØ¹Ù
ا٠اÙÙØ§Ø¦Ù Ø§ÙØ´Ø¨Ù٠باÙÙ
صÙÙÙØ§Øª âargsâ ÙØ§Ø¦Ù
ة٠باÙÙ
ÙØ¹Ø·Ùات ÙÙØ¯Ø§ÙØ©.
اÙÙØ§Ø±Ù اÙÙØÙØ¯ بÙÙ âcallâ Ùâapplyâ Ù٠أÙÙ Ø§ÙØ£ÙÙÙ ÙØªÙÙÙØ¹ ÙØ§Ø¦Ù
Ø© باÙÙ
ÙØ¹Ø·Ùات بÙÙÙ
ا Ø§ÙØ«Ø§ÙÙ ÙØ£Ø®Ø° ÙØ§Ø¦ÙÙØ§ شبÙÙÙØ§ باÙÙ
صÙÙÙØ§Øª ÙØÙÙÙØ§.
أ٠أÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ÙÙ Ø§ÙØ¢ØªÙ٠٠تساÙÙÙÙ ØªÙØ±ÙØ¨ÙØ§:
func.call(context, ...args); // ÙÙ
Ø±ÙØ± اÙÙØ§Ø¦Ù ÙØ§Ø¦Ù
ة٠بÙ
ÙØ¹Ø§Ù
Ù Ø§ÙØªÙØ²ÙØ¹
func.apply(context, args); // â«ÙÙØ³ اÙÙÙØ±Ø© باستعÙ
ا٠apply
ÙÙÙÙ ÙÙØ§Ù ÙØ±Ù Ø¨Ø³ÙØ· ÙØ§ØØ¯:
- ÙÙØªÙØ ÙÙØ§ Ù
ÙØ¹Ø§Ù
Ù Ø§ÙØªÙØ²ÙØ¹
â...âØªÙ Ø±ÙØ± اÙÙ ÙØªØ¹Ø¯ÙÙØ¯âargsâÙØ§Ø¦Ù ة٠إÙÙâcallâ. - ÙØ§ ÙÙØ¨Ù
âapplyâØ¥ÙÙØ§ Ù ÙØ¹Ø§Ù ÙâargsâØ´Ø¨Ù٠باÙ٠صÙÙÙØ§Øª.
أ٠أÙÙ ÙØ°ÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ÙÙ ÙÙÙÙ
ÙÙØ§Ù بعضÙÙ
ا Ø§ÙØ¨Ø¹Ø¶. Ù٠تÙÙÙØ¹Ùا ÙØµÙÙ Ù
ÙØªØ¹Ø¯ÙÙØ¯ ÙÙØ³ØªØ¹Ù
Ù âcallâØ ÙÙ٠تÙÙÙØ¹Ùا شبÙÙÙØ§ باÙÙ
صÙÙÙØ§Øª ÙØ³ØªØ¹Ù
Ù âapplyâ.
Ø£Ù
ÙØ§ اÙÙØ§Ø¦Ùات اÙÙ
ÙØªØ¹Ø¯ÙÙØ¯Ø© ÙØ§ÙشبÙÙØ© باÙÙ
صÙÙÙØ§Øª (Ù
ث٠اÙÙ
صÙÙÙØ§Øª Ø§ÙØÙÙÙÙØ©)Ø ÙÙÙ
ÙÙÙØ§ ÙØ¸Ø±ÙÙØ§ استعÙ
ا٠أÙÙ Ù
Ù Ø§ÙØ§Ø«ÙÙÙØ Ø¥ÙÙØ§ Ø£ÙÙ âapplyâ Ø³ÙÙÙ٠أسرع ØºØ§ÙØ¨Ùا إذ Ø£ÙÙ Ù
ÙØ¹Ø¸Ù
Ù
ØØ±ÙÙØ§Øª Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ØªØØ³Ù٠أدائ٠داخÙÙÙØ§ Ø£ÙØ«Ø± Ù
Ù âcallâ.
ÙÙØ¯Ù ØªÙ Ø±ÙØ± ÙØ§ÙØ© اÙÙ ÙØ¹Ø§Ù ÙØ§Øª (٠ع Ø§ÙØ³ÙاÙ) Ù Ù Ø¯Ø§ÙØ© Ø¥ÙÙ Ø£Ø®Ø±Ù Ø¨ØªÙ Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡.
Ø¥ÙÙ٠أبسط ØµÙØ±Ù:
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() ); // â«Ø®Ø·Ø£: arguments.join ÙÙØ³Øª Ø¨Ø¯Ø§ÙØ©
}
hash(1, 2);
٠ع ذÙÙ Ù٠ا زا٠ÙÙØ§Ù طرÙÙØ© سÙÙØ© ÙØ¶Ù Ù Ø¹ÙØ§ØµØ± اÙ٠صÙÙÙØ©:
function hash() {
alert( [].join.call(arguments) ); // 1,2
}
hash(1, 2);
ÙØ¯Ø¹Ù ÙØ°Ù Ø§ÙØ®Ø¯Ø¹Ø© باستعارة Ø§ÙØªÙØ§Ø¨ÙØ¹.
ÙÙÙØ§ ÙØ£Ø®Ø° (Ø£Ù ÙØ³ØªØ¹Ùر) ØªØ§Ø¨ÙØ¹ Ø§ÙØ¶Ù
Ù Ù
٠اÙÙ
صÙÙÙØ§Øª Ø§ÙØ¹Ø§Ø¯ÙØ© (â[].joinâ) ÙÙØ³ØªØ¹Ù
Ù â[].join.callâ ÙØªØ´ØºÙÙÙ Ø¯Ø§Ø®Ù Ø³ÙØ§Ù âargumentsâ.
ÙÙÙÙØ Ù٠٠تع٠٠أصÙÙØ§Ø
ÙØ°Ø§ بسبب بساطة Ø§ÙØ®ÙارزÙ
ÙØ© Ø§ÙØ¯Ø§Ø®ÙÙØ© ÙÙØªØ§Ø¨Ùع Ø§ÙØ£ØµÙÙ âarr.join(glue)â Ù٠اÙÙØºØ©.
Ø£ÙØªØ¨Ø³ -بتصرÙÙ Ø®ÙÙÙ Ø¬Ø¯ÙØ§- Ù Ù Ù ÙØ§ØµÙات اÙÙØºØ©:
- ÙÙ
ÙØ§ Ø£ÙÙ
âglueâÙ٠اÙÙ ÙØ¹Ø§Ù Ù Ø§ÙØ£ÙÙØ ÙÙÙ Ù٠تÙÙ ÙÙØ§Ù Ù ÙØ¹Ø§Ù ÙØ§Øª ÙÙÙâ","â. - ÙÙ
ÙØ§ Ø£ÙÙ
âresultâÙÙ Ø³ÙØ³ÙØ© ÙØµÙØ© ÙØ§Ø±ØºØ©. - أضÙÙ
âthis[0]âØ¥ÙÙ ÙÙØ§ÙØ©âresultâ. أضÙÙâglueâÙâthis[1]â. - أضÙÙ
âglueâÙâthis[2]â. - â¦ÙØ±ÙØ± ØØªÙÙ ÙØªÙÙ٠ضÙ
Ù Ø§ÙØ¹Ùاصر اÙÙ
âthis.lengthâ. - Ø£Ø¹ÙØ¯
âresultâ.
Ø¥Ø°ÙØ§ ÙÙÙ ÙØ£Ø®Ø° âthisâ ÙÙØ¶Ù
Ù âthis[0]â Ø«Ù
Ù âthis[1]â ÙÙÙØ°Ø§ Ù
Ø¹ÙØ§. ÙØªØ¨ اÙÙ
Ø·ÙÙØ±ÙÙ Ø§ÙØªØ§Ø¨Ùع Ø¨ÙØ°Ù Ø§ÙØ·Ø±ÙÙØ© عÙ
Ø¯ÙØ§ ÙÙØ³Ù
Ø Ø£Ù ØªÙÙÙ âthisâ Ø£Ù٠شبÙ٠باÙÙ
صÙÙÙØ§Øª (ÙÙØ³Øª Ù
ØµØ§Ø¯ÙØ© إذ تتبع ÙØ«Ùر Ù
Ù Ø§ÙØªÙØ§Ø¨ÙØ¹ ÙØ°Ù اÙÙ
Ù
ارسة). ÙÙØ°Ø§ ÙØ¹Ù
Ù Ø§ÙØªØ§Ø¨Ùع ØÙÙ ÙÙÙÙ âthis=argumentsâ.
اÙÙ ÙØ²Ø®Ø±ÙÙØ§Øª ÙØ®Ø§ØµÙات Ø§ÙØ¯ÙاÙ
Ø§Ø³ØªØ¨Ø¯Ø§Ù Ø§ÙØ¯ÙØ§Ù Ø£Ù Ø§ÙØªÙØ§Ø¨ÙØ¹ بأخر٠Ù
ÙØ²Ø®Ø±ÙØ© Ù٠أÙ
ر Ø¢Ù
Ù Ø¹Ø§Ø¯Ø©ÙØ ÙÙÙÙ Ø¨Ø§Ø³ØªØ«ÙØ§Ø¡ ØµØºÙØ±: ÙÙ Ø§ØØªÙت Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£ÙÙÙØ© عÙÙ Ø®Ø§ØµÙØ§Øª (Ù
ث٠âfunc.calledCountâ) ÙÙÙ ØªÙØ¯ÙÙ
ÙØ§ Ø§ÙØ¯Ø§ÙØ© اÙÙ
ÙØ²Ø®Ø±ÙØ©Ø Ø¥Ø° Ø£ÙÙÙØ§ غÙÙØ§Ù عÙÙ Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£ØµÙÙØ©. عÙÙÙØ§ بذÙÙ Ø£Ù ÙØØ°Ø± ÙÙ ÙØ°Ù Ø§ÙØØ§ÙØ©.
ÙØ£Ø®Ø° اÙÙ
Ø«Ø§Ù Ø£Ø¹ÙØ§Ù Ù
ثاÙÙØ§Ø ÙÙ Ø§ØØªÙت Ø§ÙØ¯Ø§ÙØ© âslowâ Ø£ÙÙ Ø®Ø§ØµÙØ§Øª ÙÙÙ ÙØØªÙÙ Ø§ÙØºÙÙØ§Ù âcachingDecorator(slow)â Ø¹ÙÙÙØ§.
ÙÙ ÙÙ Ø£Ù ØªÙØ¯ÙÙ ÙÙØ§ بعض اÙÙ ÙØ²Ø®Ø±ÙÙØ§Øª Ø®Ø§ØµÙØ§Øª خاصة Ø¨ÙØ§. ÙÙ Ø«ÙÙØ§ ÙÙ ÙÙ Ø£Ù ÙØ¹Ø¯Ù اÙÙ ÙØ²Ø®Ø±ÙÙ ÙÙ Ù Ø±ÙØ© Ø¹Ù ÙØª Ø§ÙØ¯Ø§ÙØ© ÙÙÙ Ù Ù ÙÙØª أخذ ذÙÙØ ÙØªÙدÙÙ ÙÙØ§ Ø®Ø§ØµÙØ§Øª ÙÙØ±Ù ÙØ°Ù Ù٠عÙÙ٠ات.
ØªÙØ¬Ø¯ طرÙÙØ© ÙØ¥Ùشاء Ù
ÙØ²Ø®Ø±ÙÙØ§Øª ØªØØªÙظ بÙ
ÙØ²Ø© اÙÙØµÙ٠إÙÙ Ø®Ø§ØµÙØ§Øª Ø§ÙØ¯ÙØ§ÙØ ÙÙÙÙÙÙØ§ ØªØ·ÙØ¨ استعÙ
ا٠اÙÙØ§Ø¦Ù اÙÙØ³ÙØ· âProxyâ ÙØªØºÙÙÙ Ø§ÙØ¯ÙاÙ. Ø³ÙØ´Ø±Ø ÙØ°Ø§ اÙÙØ§Ø¦Ù ÙØ§ØÙÙØ§ ÙÙ ÙØ³Ù
«تغÙÙÙ Ø§ÙØ¯ÙاÙ: âapplyâ».
Ù ÙØ®Øµ
ØªÙØ¹Ø¯Ù اÙÙ ÙØ²Ø®Ø±ÙÙØ§Øª أغÙÙØ© ØÙÙ Ø§ÙØ¯ÙØ§Ù ÙØªØ¹Ø¯Ù٠سÙÙÙÙØ§Ø بÙÙ٠ا اÙÙ ÙÙ Ø© Ø§ÙØ£Ø³Ø§Ø³ ٠رÙÙÙØ© Ø¨Ø§ÙØ¯Ø§ÙØ© ÙÙØ³Ùا.
ÙÙ Ù٠عد٠اÙÙ ÙØ²Ø®Ø±ÙÙØ§Øª Â«Ù Ø²Ø§ÙØ§Â» ÙÙØ¶ÙÙÙØ§ عÙÙ Ø§ÙØ¯Ø§ÙØ©Ø ÙÙÙØ¶ÙÙ ÙØ§ØØ¯Ø© Ø£Ù Ø£ÙØ«Ø±Ø ÙØ¯Ù٠تغÙÙØ± Ø£Ù٠سطر ÙÙ Ø§ÙØ´ÙÙØ±Ø©!
رأÙÙØ§ Ø§ÙØªÙØ§Ø¨ÙØ¹ Ø§ÙØ¢ØªÙØ© ÙÙØ¹Ø±Ù ÙÙÙÙØ© إعداد اÙÙ
ÙØ²Ø®Ø±ÙÙ âcachingDecoratorâ:
- func.call(context, arg1, arg2â¦) â ÙØ³ØªØ¯Ø¹Ù
âfuncâØØ³Ø¨ Ø§ÙØ³ÙØ§Ù ÙØ§ÙÙ ÙØ¹Ø§Ù ÙØ§Øª اÙÙ Ù Ø±ÙØ±Ø©. - func.apply(context, args) â ÙØ³ØªØ¯Ø¹Ù
âfuncâØÙØ« ÙÙÙ Ø±ÙØ±âcontextâØ¨ØµÙØªÙâthisâÙØ§ÙÙØ§Ø¦Ù Ø§ÙØ´Ø¨Ù٠باÙ٠صÙÙÙØ§ØªâargsâÙÙ ÙØ§Ø¦Ù Ø© اÙÙ ÙØ¹Ø§Ù ÙØ§Øª.
عادة٠Ù
ا ÙÙØªØ¨ تÙ
Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª باستعÙ
ا٠âapplyâ:
let wrapper = function() {
return original.apply(this, arguments);
};
ÙÙ
ا رأÙÙØ§ Ù
ثاÙÙØ§ ع٠استعارة Ø§ÙØªÙØ§Ø¨ÙØ¹ ØÙØ« Ø£Ø®Ø°ÙØ§ ØªØ§Ø¨ÙØ¹Ùا Ù
Ù ÙØ§Ø¦Ù ÙØ§Ø³ØªØ¯Ø¹ÙÙØ§Ù âcallâ ÙÙ Ø³ÙØ§Ù ÙØ§Ø¦Ù آخر ØºÙØ±Ù. ÙØ´Ùع بÙ٠اÙÙ
Ø·ÙÙØ±Ù٠أخذ ØªÙØ§Ø¨Ùع اÙÙ
صÙÙÙØ§Øª ÙØªØ·Ø¨ÙÙÙØ§ عÙ٠اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª âargumentsâ. Ù٠أردت بدÙÙÙØ§ ÙØ°ÙÙ ÙØ§Ø³ØªØ¹Ù
Ù ÙØ§Ø¦Ù اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª Ø§ÙØ¨ÙÙØ© إذ ÙÙ Ù
صÙÙÙØ© ØÙÙÙÙØ©.
ستجد Ù٠رØÙت٠اÙÙ ØÙÙÙØ© باÙ٠خاطر Ù ÙØ²Ø®Ø±ÙÙØ§Øª Ø¹Ø¯ÙØ¯Ø©. ØØ§ÙÙÙ Ø§ÙØªÙ Ø±ÙØ³ عÙÙÙØ§ بØÙ٠ت٠ارÙÙ ÙØ°Ø§ اÙÙØµÙ.
ت٠ارÙÙ
Ù ÙØ²Ø®Ø±ÙÙ ØªØ¬Ø³ÙØ³
Ø§ÙØ£ÙÙ ÙØ©: 5
Ø£ÙØ´Ùئ اÙÙ
ÙØ²Ø®Ø±ÙÙ âspy(func)â ÙÙÙØ¹Ùد غÙÙØ§ÙÙØ§ ÙØÙØ¸ ÙÙ٠استدعاءات تÙÙ Ø§ÙØ¯Ø§ÙØ© ÙÙ Ø®Ø§ØµÙØ© âcallsâ Ø¯Ø§Ø®ÙÙ.
اØÙظ ÙÙ٠استدعاء عÙ٠أÙÙ٠٠صÙÙÙØ© ٠٠اÙÙÙØ³Ø·Ø§Ø¡.
٠ثاÙ:
function work(a, b) {
alert( a + b ); // â«ÙÙØ³Øª work Ø¥ÙÙØ§ Ø¯Ø§ÙØ© Ø£Ù ØªØ§Ø¨ÙØ¹Ùا ÙØ³Ùا ÙØ¹Ø±Ù أصÙÙ
}
work = spy(work); // (*)
work(1, 2); // 3
work(4, 5); // 9
for (let args of work.calls) {
alert( 'call:' + args.join() ); // "call:1,2", "call:4,5"
}
Ù
ÙØ§ØØ¸Ø©: ÙØ³ØªÙÙØ¯ Ù
Ù ÙØ°Ø§ اÙÙ
ÙØ²Ø®Ø±Ù٠أØÙاÙÙØ§ ÙØ§Ø®ØªØ¨Ø§Ø± اÙÙØØ¯Ø§Øª. ÙÙ
Ù٠عد٠âsinon.spyâ Ù٠اÙÙ
ÙØªØ¨Ø© Sinon.JS ØµÙØ±Ø©Ù Ù
ØªÙØ¯ÙÙ
ة٠عÙÙ.
Ø§ÙØÙ
سÙÙØ®Ø²ÙÙ Ø§ÙØºÙÙØ§Ù Ø§ÙØ°Ù أعادت٠spy(f)â ÙÙ٠اÙÙÙØ³Ø·Ø§Ø¡Ø Ø¨Ø¹Ø¯ÙØ§ ÙØ³ØªØ¹Ù
Ù f.apply ÙØªÙ
Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡.
â¦â¦
Ù ÙØ²Ø®Ø±ÙÙ ØªØ£Ø®ÙØ±
Ø§ÙØ£ÙÙ ÙØ©: 5
Ø£ÙØ´Ùئ اÙÙ
ÙØ²Ø®Ø±Ù âdelay(f, ms)â ÙÙÙØ¤Ø®Ùر ÙÙ٠استدعاء Ù
Ù âfâ Ø¨Ù
ÙØ¯Ø§Ø± âmsâ Ù
ÙÙØ«Ø§ÙÙØ©.
٠ثاÙ:
function f(x) {
alert(x);
}
// Ø£ÙØ´Ùئ Ø§ÙØºÙÙØ§Ùات
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);
f1000("test"); // â«Ùعرض «test» بعد 1000 Ù
ÙÙØ«Ø§ÙÙØ©
f1500("test"); // â«Ùعرض «test» بعد 1500 Ù
ÙÙØ«Ø§ÙÙØ©
أ٠أÙ٠اÙÙ
ÙØ²Ø®Ø±ÙÙ âdelay(f, ms)â ÙÙØ¹Ùد ÙØ³Ø®Ø© ع٠âfâ «تأجÙÙØª âmsâ».
Ø§ÙØ¯Ø§ÙØ© âfâ ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø£Ø¹ÙØ§Ù ØªÙØ¨Ù ÙØ³ÙØ·ÙØ§ ÙØ§ØØ¯ÙØ§Ø ÙÙÙ٠عÙÙ Ø§ÙØÙ Ø§ÙØ°Ù Ø³ØªÙØªØ¨Ù تÙ
Ø±ÙØ± ÙÙ٠اÙÙÙØ³Ø·Ø§Ø¡ ÙØ§ÙØ³ÙØ§Ù âthisâ ÙØ°ÙÙ.
Ø§ÙØÙ
function delay(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
let f1000 = delay(alert, 1000);
f1000("test"); // â«Ùعرض test بعد 1000 Ù
ÙÙØ«Ø§ÙÙØ©
ÙØ§ØØ¸ بأÙÙØ§ استعÙ
ÙÙØ§ Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ³ÙÙ
ÙØ© ÙÙØ§. ÙÙ
ا ÙØ¹ÙÙ
ÙØ§ÙØ¯ÙØ§Ù Ø§ÙØ³ÙÙ
ÙØ© ÙØ§ تÙ
ÙÙ ÙØ§ âthisâ ÙÙØ§ âargumentsâØ ÙØ°Ø§ ÙØ£Ø®Ø° âf.apply(this, arguments)â ÙÙÙØ§ âthisâ Ùâargumentsâ Ù
Ù Ø§ÙØºÙÙØ§Ù.
ÙÙ Ù
Ø±ÙØ±Ùا Ø¯Ø§ÙØ© Ø¹Ø§Ø¯ÙØ© ÙØ³ÙستدعÙÙØ§ âsetTimeoutâ Ø¨Ø¯Ù٠اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª ÙÙØ¶Ø¨Ø· âthis=windowâ (باعتبار Ø£ÙÙØ§ ÙÙ Ø¨ÙØ¦Ø© اÙÙ
تصÙÙØ).
Ù
ع ذÙÙ ÙÙ
ÙÙÙØ§ تÙ
Ø±ÙØ± ÙÙÙ
Ø© âthisâ Ø§ÙصØÙØØ© باستعÙ
ا٠Ù
تغÙÙØ± ÙØ³ÙØ· ÙÙÙÙ٠ذÙ٠سÙÙÙÙ ØªØ¹Ø¨ÙØ§ ÙØ§ داع٠ÙÙ:
function delay(f, ms) {
return function(...args) {
let savedThis = this; // خزÙÙÙ ÙÙ Ù
ØªØºÙØ± ÙØ³ÙØ·
setTimeout(function() {
f.apply(savedThis, args); // استعÙ
٠اÙÙØ³ÙØ· ÙÙØ§
}, ms);
};
}
Ù ÙØ²Ø®Ø±Ù Ø¥Ø²Ø§ÙØ© ارتداد
Ø§ØµÙØ¹ اÙÙ
ÙØ²Ø®Ø±ÙÙ âdebounce(f, ms)â ÙÙÙØ¹Ùد غÙÙØ§ÙÙØ§ ÙÙÙ
Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø¥ÙÙ âfâ Ù
Ø±ÙØ© ÙØ§ØØ¯Ø© ÙÙÙ âmsâ Ù
ÙÙØ«Ø§ÙÙØ©.
بعبارة أخرÙ: ØÙÙ ÙØ¯Ø¹Ù Ø§ÙØ¯Ø§ÙØ© «بأÙÙ Ø§Ø±ØªØ¯Ø§Ø¯ÙØ§ Ø£ÙØ²ÙÙ» Debounce ÙÙ٠تضÙ
Ù ÙÙØ§ بأÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª Ø§ÙØªÙ Ø³ØªØØ¯Ø« Ù٠أÙÙÙ Ù
Ù âmsâ Ù
ÙÙØ«Ø§ÙÙØ© بعد Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø§ÙØ³Ø§Ø¨Ù â Ø³ØªÙÙÙ
Ù.
٠ثاÙ:
let f = debounce(alert, 1000);
f(1); // ÙØ¹Ù
Ù Ù
باشرةÙ
f(2); // ÙÙÙÙ
Ù
setTimeout( () => f(3), 100); // â«ÙÙÙÙ
Ù ( ÙÙ
تÙ
ر٠إÙÙØ§ 100 Ù
Ù٠ثاÙÙØ© )
setTimeout( () => f(4), 1100); // ÙØ¹Ù
Ù
setTimeout( () => f(5), 1500); // â«ÙÙÙÙ
Ù (ÙÙ
تÙ
ر٠اÙÙ 1000 Ù
ÙÙØ«Ø§ÙÙØ© Ù
٠آخر تشغÙÙ)
عÙ
ÙÙÙØ§ ÙÙ Ø§ÙØ´ÙÙØ±Ø§ØªØ ÙØ³ØªØ¹Ù
Ù âdebounceâ ÙÙØ¯ÙØ§Ù Ø§ÙØªÙ تستÙÙ
Ø£Ù ØªÙØØ¯ÙØ« Ø´ÙØ¦Ùا Ù
ا ÙØ¹Ø±Ù Ù
سبÙÙØ§ بأÙÙ ÙØ§ Ø´ÙØ¡ Ø¬Ø¯ÙØ¯ Ø³ÙØØ¯Ø« ÙÙ ÙÙ ÙØ°Ù اÙÙØªØ±Ø© اÙÙØµÙØ±Ø©Ø ÙØ§ÙØ£ÙØ¶Ù Ø£Ù ÙÙÙÙ
ÙÙ ÙÙØ§ ÙÙÙØ¯Ø± اÙÙ
ÙØ§Ø±Ø¯.
Ø§ÙØÙ
function debounce(f, ms) {
let isCooldown = false;
return function() {
if (isCooldown) return;
f.apply(this, arguments);
isCooldown = true;
setTimeout(() => isCooldown = false, ms);
};
}
استدعاء âdebounceâ ÙÙØ¹Ùد غÙÙØ§ÙÙØ§. Ø«Ù
ÙØ© ØØ§ÙتÙÙ Ø§Ø«ÙØªÙÙ ÙÙØ°Ø§ Ø§ÙØºÙÙØ§Ù:
âisCooldown = falseââ ÙÙ ÙÙ Ø£Ù ØªØ¹Ù Ù Ø§ÙØ¯Ø§ÙØ©.âisCooldown = trueââ ÙÙØªØ¸Ø± Ø§ÙØªÙاء اÙÙ ÙÙØ©.
Ù٠أÙÙ٠استدعاء ÙÙÙÙ âisCooldownâ Ø¨ÙÙÙ
Ø© âfalseâ ÙÙØ¹Ù
Ù Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø ÙØªØªØºÙÙØ± Ø§ÙØØ§ÙØ© Ø¥ÙÙ âtrueâ.
ÙÙÙÙ
٠أÙ٠استدعاء آخر طاÙÙ
ا âisCooldownâ ØµØÙØØ©.
Ø¨Ø¹Ø¯ÙØ§ ÙØ¹Ùس âsetTimeoutâ Ø§ÙØØ§ÙØ© Ø¥ÙÙ âfalseâ Ø¨Ø¹Ø¯ Ù
Ø±ÙØ± ÙØªØ±Ø© Ø§ÙØªØ£Ø¬ÙÙ.
Ù ÙØ²Ø®Ø±ÙÙ Ø®ÙÙ
Ø§ÙØ£ÙÙ ÙØ©: 5
Ø£ÙØ´Ùئ Ù
ÙØ²Ø®Ø±ÙÙ Â«Ø§ÙØ®ÙÙ/throttle» ââthrottle(f, ms)â ÙÙÙØ¹Ùد غÙÙØ§ÙÙØ§ ÙÙÙ
Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø¥ÙÙ âfâ Ù
Ø±ÙØ© ÙÙÙ âmsâ Ù
ÙÙØ«Ø§ÙÙØ©. ÙØ§Ùاستدعاءات Ø§ÙØªÙ ØªØØ¯Ø« ÙÙ ÙØªØ±Ø© Â«Ø§ÙØ±Ø§ØØ©Â» تÙÙÙ
Ù.
اÙÙØ±Ù بÙÙ ÙØ°Ù ÙØ¨ÙÙ âdebounceâ Ù٠أÙÙÙ ÙÙ ÙØ§Ù Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ اÙÙ
ÙÙÙ
Ù Ù٠آخر Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª Ø£Ø«ÙØ§Ø¡ ÙØªØ±Ø© Ø§ÙØ±Ø§ØØ©Ø ÙØ³ÙعÙ
Ù Ù
ØªÙ Ø§ÙØªÙت تÙ٠اÙÙØªØ±Ø©.
ÙÙØ·Ø§Ùع ÙØ°Ø§ Ø§ÙØªØ·Ø¨ÙÙ Ù Ù Ø§ÙØÙØ§Ø© Ø§ÙØ¹Ù ÙÙØ© ÙÙØ¹Ø±Ù Ø£ÙÙ ÙØ© ÙØ°Ø§ Ø§ÙØ´ÙØ¡ Ø§ÙØºØ±Ùب Ø§ÙØ¹Ø¬Ùب Ù٠ا أساس٠أصÙÙØ§.
ÙÙÙÙ Ù Ø«ÙÙØ§ Ø£ÙÙØ§ ÙØ±Ùد تعÙÙØ¨ ØªØØ±Ù٠اÙÙØ£Ø±Ø©.
ÙÙ ÙÙ Ø£Ù ÙØ¶Ø¨Ø· Ø¯Ø§ÙØ© (Ù٠اÙ٠تصÙÙØ) ÙØªØ¹Ù Ù ÙÙÙ٠ا ØªØØ±ÙÙØª اÙÙØ£Ø±Ø© ÙØªØ£Ø®Ø° Ù ÙØ§Ù اÙÙ Ø¤Ø´ÙØ± Ø£Ø«ÙØ§Ø¡ ÙØ°Ù Ø§ÙØØ±ÙØ©. ÙÙ ÙÙØª تستع٠٠اÙÙØ£Ø±Ø© ÙØ¹Ø§Ø¯Ø©Ù ٠ا ØªØ¹Ù Ù Ø§ÙØ¯Ø§ÙØ© ÙØ°Ù بسرعة (رب٠ا تÙÙÙ 100 Ù Ø±ÙØ© ÙÙ Ø§ÙØ«Ø§ÙÙØ©Ø Ø£Ù ÙÙÙ 10 Ù ÙÙØ«ÙاÙ).
ÙØ±Ùد ØªØØ¯ÙØ« بعض اÙ٠عÙÙ٠ات ÙÙ ØµÙØØ© اÙÙÙØ¨ Ø£Ø«ÙØ§Ø¡ ØØ±ÙØ© اÙÙ Ø¤Ø´ÙØ±.
â¦ÙÙÙÙ ØªØØ¯ÙØ« Ø§ÙØ¯Ø§ÙØ© âupdate()â Ø¹Ù
ÙÙØ© Ø«ÙÙÙØ© ÙÙØ§ تÙÙØ¹ ÙÙÙÙ ØØ±ÙØ© ÙØ£Ø±Ø© ØµØºÙØ±Ø©. ÙÙ
ا ÙÙÙØ³ Ù
ÙØ·ÙÙÙØ§ أصÙÙØ§ Ø§ÙØªØØ¯ÙØ« Ø£ÙØ«Ø± Ù
Ù Ù
Ø±ÙØ© ÙÙÙ 100 Ù
ÙÙØ«Ø§ÙÙØ©.
ÙØ°Ø§ ÙÙØºÙÙÙ Ø§ÙØ¯Ø§ÙØ© ÙÙ Ù
ÙØ²Ø®Ø±Ù: ÙØ³ØªØ¹Ù
Ù âthrottle(update, 100)â Ø¹Ù٠أÙÙÙØ§ Ø¯Ø§ÙØ© Ø§ÙØªØ´ØºÙÙ ÙÙÙÙ
ا ØªØØ±ÙÙØª اÙÙØ£Ø±Ø© بدÙÙØ§ Ù
Ù Ø§ÙØ¯Ø§ÙØ© âupdate()â Ø§ÙأصÙÙØ©. سÙÙØ³ØªØ¯Ø¹Ù اÙÙ
ÙØ²Ø®Ø±ÙÙ ÙØ«ÙØ±ÙØ§ صØÙØØ ÙÙÙÙÙÙØ§ ÙÙ ÙÙ
Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª ÙØ°Ù Ø¥ÙÙ âupdate()â Ø¥ÙÙØ§ Ù
Ø±ÙØ© ÙÙÙ 100 Ù
ÙÙØ«Ø§ÙÙØ©.
ÙÙØ°Ø§ Ø³ÙØ¸Ùر ÙÙ٠ستخد٠:
- Ù٠أÙÙÙ ØªØØ±ÙÙ ÙÙÙØ£Ø±Ø©Ø تÙÙ
Ø±ÙØ± ÙØ³Ø®ØªÙا اÙÙ
ÙØ²Ø®Ø±ÙØ© Ù
Ù Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ù
باشرة٠إÙÙ
âupdateâØ ÙÙØ°Ø§ Ù Ù٠٠إذ ÙØ±Ù اÙ٠ستخد٠ÙÙÙ ØªÙØ§Ø¹Ùت Ø§ÙØµÙØØ© ٠باشرة٠٠ع ØªØØ±ÙÙ٠اÙÙØ£Ø±Ø©. - Ø«Ù
Ù ÙÙØØ±Ù٠اÙÙ
ستخدÙ
اÙÙØ£Ø±Ø© Ø£ÙØ«Ø±Ø ÙÙØ§ ÙØØ¯Ø« Ø´ÙØ¡ طاÙÙ
ا ÙÙ
تÙ
رÙ
â100msâ. ÙØ³Ø®ØªÙا اÙÙ ÙØ²Ø®Ø±ÙØ© Ø§ÙØ±Ø§Ø¦Ø¹Ø© تÙÙ٠٠تÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª. - بعد ÙÙØ§ÙØ©
â100msâÙØ¹Ù ٠آخر استدعاءâupdateâØØ§Ù ÙÙØ§ Ø§ÙØ¥ØØ¯Ø§Ø«Ùات Ø§ÙØ£Ø®Ùرة. - ÙØ£Ø®ÙØ±ÙØ§ تتÙÙÙ٠اÙÙØ£Ø±Ø© Ø¹Ù Ø§ÙØØ±Ø§Ù. ØªÙØªØ¸Ø± Ø§ÙØ¯Ø§ÙØ© اÙÙ
ÙØ²Ø®Ø±ÙØ© ØØªÙ تÙ
ضÙ
â100msâÙØ«Ù ٠تشغÙÙâupdateâØØ§Ù ÙØ©Ù آخر Ø§ÙØ¥ØØ¯Ø§Ø«Ùات. ÙÙÙØ°Ø§ ÙÙØ¹Ø§Ùج آخر ØØ±ÙØ© ÙÙÙØ£Ø±Ø©Ø ÙÙØ°Ø§ Ù ÙÙ
Ù Ø«Ø§Ù Ø¹Ù Ø§ÙØ´ÙÙØ±Ø©:
function f(a) {
console.log(a);
}
// تÙ
Ø±ÙØ± f1000 Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª Ø¥ÙÙ f Ù
Ø±ÙØ© ÙÙÙ 1000 Ù
ÙÙØ«Ø§ÙÙØ© ÙØØ¯Ù Ø£ÙØµÙ
let f1000 = throttle(f, 1000);
f1000(1); // تعرض 1
f1000(2); // (Ù
Ø®ÙÙÙØ©Ø ÙÙ
تÙ
ض 1000 Ù
ÙÙØ«Ø§ÙÙØ© بعد)
f1000(3); // (Ù
Ø®ÙÙÙØ©Ø ÙÙ
تÙ
ض 1000 Ù
ÙÙØ«Ø§ÙÙØ© بعد)
// â«ØÙ٠تÙ
ض٠1000 Ù
ÙÙØ«Ø§ÙÙØ©...
// â«...تطبع 3Ø Ø¥Ø° اÙÙÙÙ
Ø© 2 اÙÙØ³Ø·ÙØ© Ø£ÙÙÙ
ÙØª
Ù
ÙØ§ØØ¸Ø©: ÙØ¬Ø¨ تÙ
Ø±ÙØ± اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª ÙØ§ÙØ³ÙØ§Ù âthisâ Ø§ÙÙ
ÙÙ
Ø±ÙØ±Ø© Ø¥ÙÙ âf1000â- تÙ
Ø±ÙØ±Ùا Ø¥ÙÙ âfâ Ø§ÙأصÙÙØ©.
Ø§ÙØÙ
function throttle(func, ms) {
let isThrottled = false,
savedArgs,
savedThis;
function wrapper() {
if (isThrottled) { // (2)
savedArgs = arguments;
savedThis = this;
return;
}
func.apply(this, arguments); // (1)
isThrottled = true;
setTimeout(function() {
isThrottled = false; // (3)
if (savedArgs) {
wrapper.apply(savedThis, savedArgs);
savedArgs = savedThis = null;
}
}, ms);
}
return wrapper;
}
ÙÙØ¹Ùد استدعاء âthrottle(func, ms)â Ø§ÙغÙÙØ§Ù âwrapperâ.
- Ø£Ø«ÙØ§Ø¡ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø§ÙØ£ÙÙØ ÙÙØ´ØºÙÙ
âwrapperâØ¨Ø¨Ø³Ø§Ø·Ø© Ø§ÙØ¯Ø§ÙØ©âfuncâÙÙØ¶Ø¨Ø· ØØ§ÙØ© Ø§ÙØ±Ø§ØØ© (âisThrottled = trueâ). - ÙÙ ÙØ°Ù Ø§ÙØØ§ÙØ© ÙØÙØ¸ ÙÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª ÙÙ
âsavedArgs/savedThisâ. ÙØ§ØØ¸ بأÙÙ Ø§ÙØ³ÙØ§Ù ÙØ§ÙÙÙØ³Ø·Ø§Ø¡ Ù ÙÙ ÙØ§Ù ÙÙØ¬Ø¨ ØÙظÙ٠ا ÙÙØ§ÙÙ Ø§Ø ÙÙØØªØ§Ø¬Ù٠ا Ù Ø¹ÙØ§ ÙÙÙØ¹Ùد ذÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ù٠ا ÙØ§Ù ÙÙØ³ØªØ¯Ø¹ÙÙ ØÙÙØ§. - بعد Ù
Ø±ÙØ±
âmsâÙ ÙÙØ«Ø§ÙÙØ©Ø ÙØ¹Ù ÙâsetTimeoutâØ Ø¨ÙØ°Ø§ ØªÙØ²Ø§Ù ØØ§ÙØ© Ø§ÙØ±Ø§ØØ© (âisThrottled = falseâ) ÙÙÙ ÙØ§Ùت ÙÙØ§Ù استدعاءات Ù ÙÙÙ ÙØ©Ø ÙÙÙÙÙØ°âwrapperâØ¨Ø¢Ø®Ø± ٠ا ØÙØ¸ÙØ§ Ù Ù ÙÙØ³Ø·Ø§Ø¡ ÙØ³ÙاÙ.
ÙØ§ ÙØ´ØºÙÙ ÙÙ Ø§ÙØ®Ø·ÙØ© Ø§ÙØ«Ø§Ùثة âfuncâ Ø¨Ù âwrapperâ Ø¥Ø° ÙØ±Ùد تÙÙÙØ° âfuncâ Ø¥Ø¶Ø§Ùة٠إÙ٠دخÙÙ ØØ§ÙØ© Ø§ÙØ±Ø§ØØ© ثاÙÙØ©Ù ÙØ¶Ø¨Ø· اÙÙ
ؤÙÙØª ÙØªØµÙÙØ±Ùا.
ترج٠ة -ÙØ¨ØªØµØ±Ù- ÙÙÙØµÙ Decorators and forwarding, call/apply Ù Ù ÙØªØ§Ø¨ The JavaScript language
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)