Ø«Ù
ÙØ© Ù
Ø´ÙÙØ© Ù
عرÙÙØ© ØªÙØ§Ø¬ÙÙØ§ Ù
ت٠Ù
Ø±ÙØ±Ùا ØªÙØ§Ø¨Ùع اÙÙØ§Ø¦Ùات عÙ٠أÙÙÙØ§ Ø±Ø¯ÙØ¯ ÙØ¯Ø§Ø¡ (ÙÙ
ا ÙÙØ¹Ù Ù
ع âsetTimeoutâ)Ø ÙÙ Ø¶ÙØ§Ø¹ ÙÙÙÙØ© Ø§ÙØ£Ùا âthisâ.
Ø³ÙØ±Ù ÙÙ ÙØ°Ø§ اÙÙØµÙ Ø·Ø±Ø§Ø¦Ù Ø¥ØµÙØ§Ø ÙØ°Ù اÙÙ Ø´ÙÙØ©.
Ø¶ÙØ§Ø¹ Ø§ÙØ£Ùا (اÙÙÙÙ
Ø© اÙÙ
ÙØªØ§ØÙØ© this)
رأÙÙØ§ ÙØ¨Ù Ø§ÙØ¢Ù Ø£Ù
Ø«ÙØ© ÙÙ٠ضاعت ÙÙÙ
Ø© âthisâ. ÙÙ
ا ÙÙØ¨Ø« Ø£Ù Ù
Ø±ÙØ±Ùا Ø§ÙØªØ§Ø¨Ùع Ø¥ÙÙ Ù
ÙØ§Ù آخر Ù
ÙÙØµÙÙØ§ Ø¹Ù ÙØ§Ø¦ÙÙØ ضاع âthisâ.
Ø¥ÙÙÙ Ø¸ÙØ§Ùر ÙØ°Ù اÙÙ
Ø´ÙÙØ© باستعÙ
ا٠âsetTimeoutâ Ù
Ø«ÙÙØ§:
let user = {
firstName: "John",
sayHi() {
alert(`âHello, ${this.firstName}!â`);
}
};
setTimeout(user.sayHi, 1000); // Hello, undefined!
ÙÙ
ا رأÙÙØ§ ÙÙ ÙØ§ØªØ¬ Ø§ÙØ´ÙÙØ±Ø©Ø ÙÙ
ÙØ±ØÙب Ø¨Ø§ÙØ£Ø® «John» (ÙÙ
ا Ø£Ø±Ø¯ÙØ§ باستعÙ
ا٠âthis.firstNameâ)Ø Ø¨Ù Ø¨Ø§ÙØ£Ø® ØºÙØ± اÙÙ
عرÙÙ âundefinedâ!
ÙØ°Ø§ ÙØ£ÙÙ Ø§ÙØªØ§Ø¨Ùع âsetTimeoutâ Ø§Ø³ØªÙÙ
Ø§ÙØ¯Ø§ÙØ© âuser.sayHiâ Ù
ÙÙØµÙØ©Ù Ø¹Ù ÙØ§Ø¦ÙÙØ§. ÙÙ
Ù٠أ٠ÙÙØªØ¨ Ø§ÙØ³Ø·Ø± Ø§ÙØ£Ø®Ùر ÙÙØ°Ø§:
let f = user.sayHi;
setTimeout(f, 1000); // â«Ø¶Ø§Ø¹ Ø³ÙØ§Ù اÙÙ
ستخدÙ
user
باÙÙ
ÙØ§Ø³Ø¨Ø© ÙØ§ÙØªØ§Ø¨ÙØ¹ âsetTimeoutâ Ø¯Ø§Ø®Ù اÙÙ
تصÙÙØØ§Øª ÙØ®ØªÙÙ ÙÙÙÙÙØ§Ø إذ ÙØ¶Ø¨Ø· âthis=windowâ ØÙÙ ÙØ³ØªØ¯Ø¹Ù Ø§ÙØ¯Ø§ÙØ© (بÙÙÙ
ا ÙÙ Node.js ÙØµÙر âthisâ ÙÙ Ø°Ø§ØªÙ ÙØ§Ø¦Ù اÙÙ
ؤÙÙØªØ ÙÙÙÙÙ ÙØ°Ø§ ÙÙØ³ Ø¨Ø§ÙØ£Ù
ر اÙÙ
ÙÙ
Ø§ÙØ¢Ù). ÙØ¹Ù٠ذÙ٠بأÙÙ âthis.firstNameâ ÙÙØ§ ÙÙ ÙØ¹ÙÙÙØ§ âwindow.firstNameâØ ÙÙØ°Ø§ اÙÙ
ØªØºÙØ± ØºÙØ± Ù
ÙØ¬Ùد. عادة٠Ù
ا ØªØµÙØ± âthisâ ØºÙر Ù
عرÙÙØ© âundefinedâ ÙÙ Ø§ÙØØ§ÙØ§Øª Ø§ÙØ£Ø®Ø±Ù.
ÙØ«ÙØ±ÙØ§ ٠ا ÙÙØ§Ø¬Ù ÙØ°Ù اÙÙ Ø³Ø£ÙØ© ÙÙØÙ ÙÙØªØ¨ Ø§ÙØ´ÙÙØ±Ø©: ÙØ±Ùد Ø£Ù ÙÙ Ø±ÙØ± ØªØ§Ø¨ÙØ¹ Ø§ÙØ¯Ø§ÙØ© Ø¥ÙÙ Ù ÙØ§Ù آخر (٠ث٠ÙÙØ§Ø Ù Ø±ÙØ±Ùا٠ÙÙÙ ÙØ¬Ø¯ÙÙ) ØÙØ« سÙÙØ³ØªØ¯Ø¹Ù Ù Ù ÙÙØ§Ù. ÙÙÙ ÙÙØ§ Ø£Ù ÙØªØ£ÙÙØ¯ بأ٠ÙÙØ³ØªØ¯Ø¹Ù ÙÙ Ø³ÙØ§ÙÙ Ø§ÙØµØÙØØ
Ø§ÙØÙ Ø±ÙÙ ÙØ§ØØ¯: ÙØ³ØªØ¹Ù Ù Ø¯Ø§ÙØ© ٠غÙÙØ©
أسÙÙ Ø§ÙØÙÙÙ ÙÙ Ø§Ø³ØªØ¹Ù Ø§Ù Ø¯Ø§ÙØ© غاÙÙÙØ© Wrapping function:
let user = {
firstName: "John",
sayHi() {
alert(`âHello, ${this.firstName}!â`);
}
};
setTimeout(function() {
user.sayHi(); // Hello, John!
}, 1000);
Ø§ÙØ¢Ù Ø§ÙØªÙ
ÙØª اÙÙ
ÙÙ
Ø© إذ استÙÙ
ÙØ§ اÙÙ
ستخدÙ
âuserâ Ù
Ù Ø§ÙØ¨Ùئة اÙÙ
ÙØ¹Ø¬Ù
ÙØ© Ø§ÙØ®Ø§Ø±Ø¬ÙØ©Ø ÙØ«Ù
٠استدعÙÙØ§ Ø§ÙØªØ§Ø¨Ùع ÙÙ
ا Ø§ÙØ¹Ø§Ø¯Ø©.
Ø¥ÙÙ٠ذات اÙÙ ÙÙ Ø© بأسطر Ø£ÙÙ:
setTimeout(() => user.sayHi(), 1000); // Hello, John!
٠٠تازة Ø¬Ø¯ÙØ§Ø ÙÙÙÙ Ø³ØªØ¸ÙØ± ÙÙØ§ ÙÙØ·Ø© ضع٠Ù٠بÙÙØ© Ø§ÙØ´ÙÙØ±Ø©.
Ù
اذا ÙÙ ØØ¯Ø« ÙØªØºÙÙØ±Øª ÙÙÙ
Ø© âuserâ ÙØ¨Ù أ٠تعÙ
Ù âsetTimeoutâØ (ÙØ§ ØªÙØ³Ù Ø§ÙØªØ£Ø®ÙØ±Ø Ø«Ø§ÙÙØ© ÙØ§Ù
ÙØ©!) ØÙÙÙØ§ Ø³ÙØ¬Ø¯ Ø£ÙÙØ§ استدعÙÙØ§ اÙÙØ§Ø¦Ù Ø§ÙØ®Ø·Ø£ دÙÙ Ø£Ù ÙØ¯Ø±Ù!
let user = {
firstName: "John",
sayHi() {
alert(`âHello, ${this.firstName}!â`);
}
};
setTimeout(() => user.sayHi(), 1000);
// â«...تغÙÙØ±Øª ÙÙÙ
Ø© user Ø®ÙØ§Ù تÙÙ Ø§ÙØ«Ø§ÙÙØ©
user = {
sayHi() { alert("Another user in setTimeout!"); }
};
// setTimeout! ÙÙØ§Ù Ù
ستخدÙ
آخر Ø¯Ø§Ø®Ù Ø§ÙØªØ§Ø¨Ùعâ
Ø§ÙØÙ Ø§ÙØ«Ø§ÙÙ Ø³ÙØ¶Ù Ù ÙÙØ§ Ø£ÙÙØ§ ØªØØ¯Ø« ÙÙØ°Ø§ Ø£Ù ÙØ± ØºÙØ± ٠تÙÙÙØ¹Ø©.
Ø§ÙØÙ Ø±Ù٠اثÙÙÙ: ربطة
ØªÙØ¯ÙÙ
ÙÙØ§ Ø§ÙØ¯ÙØ§Ù ØªØ§Ø¨ÙØ¹Ùا Ù
ضÙ
ÙÙÙØ§ Ù٠اÙÙØºØ© باسÙ
bind ÙØªÙØ ÙÙØ§ ضبط ÙÙÙ
Ø© âthisâ.
Ø¥ÙÙÙ ØµÙØ§ØºØªÙ Ø§ÙØ£Ø³Ø§Ø³ÙØ©:
// Ø³ØªØ£ØªÙ Ø§ÙØµÙاغة اÙÙ
عÙÙØ¯Ø© ÙØ§ØÙÙØ§ ÙØ§ تÙÙÙ
let boundFunc = func.bind(context);
ÙØ§ØªÙج Ø§ÙØªØ§Ø¨Ùع âfunc.bind(context)â ÙÙ Â«ÙØ§Ø¦Ù دخÙÙ» ÙØ´Ø¨Ù Ø§ÙØ¯Ø§ÙØ© ÙÙÙ
ÙÙ ÙÙØ§ استدعائ٠عÙ٠أÙÙÙ Ø¯Ø§ÙØ©Ø ÙØ³ÙÙ
Ø±ÙØ± ÙØ°Ø§ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø¥ÙÙ âfuncâ Ø¨Ø¹Ø¯Ù
ا ÙØ¶Ø¨Ø· âthis=contextâ Ù
Ù Ø®ÙÙ Ø§ÙØ³ØªØ§Ø±.
أ٠بعبارة Ø£Ø®Ø±ÙØ Ù٠استدعÙÙØ§ âboundFuncâ ÙÙØ£ÙÙÙ
ا استدعÙÙØ§ âfuncâ Ø¨Ø¹Ø¯Ù
ا Ø¶Ø¨Ø·ÙØ§ ÙÙÙ
Ø© âthisâ.
Ø¥ÙÙÙ Ù
ثاÙÙØ§ تÙ
Ø±ÙØ± ÙÙÙ âfuncUserâ Ø§Ùاستدعاء Ø¥ÙÙ âfuncâ Ø¨Ø¶Ø¨Ø· âthis=userâ:
let user = {
firstName: "John"
};
function func() {
alert(this.firstName);
}
let funcUser = func.bind(user);
funcUser(); // John
رأÙÙØ§ «اÙÙØ³Ø®Ø© Ø§ÙØ±Ø§Ø¨Ø·Ø©Â» Ù
Ù âfuncâØ ââfunc.bind(user)â Ø¨Ø¹Ø¯ ضبط âthis=userâ.
ÙÙ
ا Ø£Ù٠اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª ÙÙÙÙØ§ تÙÙ
Ø±ÙØ± Ø¥ÙÙ Ø¯Ø§ÙØ© âfuncâ Ø§ÙØ£ÙØµÙÙØ© «ÙÙ
ا ÙÙ». Ù
ثاÙ:
let user = {
firstName: "John"
};
function func(phrase) {
alert(phrase + ', ' + this.firstName);
}
// â«Ùربط this Ø¥ÙÙ user
let funcUser = func.bind(user);
funcUser("Hello"); // â«Hello, John (Ù
ÙØ±Ùر اÙÙ
ÙØ¹Ø§Ù
Ù "Hello" ÙÙ
ا ÙÙØ¶Ø¨Ø· this=user)
ÙÙÙØ¬Ø±Ùب Ø§ÙØ¢Ù ٠ع تابع ÙÙØ§Ø¦Ù:
let user = {
firstName: "John",
sayHi() {
alert(`âHello, ${this.firstName}!â`);
}
};
let sayHi = user.sayHi.bind(user); // (*)
// ÙÙ
ÙÙ Ø£Ù ÙØ´ØºÙÙÙØ§ دÙÙ ÙØ¬Ùد ÙØ§Ø¦Ù
sayHi(); // Hello, John!
setTimeout(sayHi, 1000); // Hello, John!
// even if the value of user changes within 1 second
// sayHi uses the pre-bound value which is reference to the old user object
user = {
sayHi() { alert("Another user in setTimeout!"); }
};
Ø£Ø®Ø°ÙØ§ ÙÙ Ø§ÙØ³Ø·Ø± â(*)â Ø§ÙØªØ§Ø¨ÙØ¹ âuser.sayHiâ ÙØ±Ø¨Ø·Ùا٠Ù
ع اÙÙ
ستخدÙ
âuserâ. ÙØ¯Ø¹Ù Ø§ÙØ¯Ø§ÙØ© âsayHiâ Ø¨Ø§ÙØ¯Ø§ÙØ© «اÙÙ
Ø±Ø¨ÙØ·Ø©Â» ØÙØ« ÙÙ
ÙÙ Ø£Ù ÙØ³ØªØ¯Ø¹ÙÙØ§ ÙÙØØ¯ÙØ§ ÙÙØ°Ø§ Ø£Ù ÙÙ
Ø±ÙØ±Ùا Ø¥ÙÙ âsetTimeoutâ. Ù
ÙÙ
ا ÙØ¹ÙÙØ§ ÙØ³ÙÙÙÙ Ø§ÙØ³Ùا٠صØÙØÙا ÙÙ
ا ÙØ±Ùد.
ÙØ±Ù ÙÙØ§ Ø£Ù٠اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª Ù
ÙØ±Ùرت «ÙÙ
ا ÙÙ» ÙÙ
ا ضبط٠âbindâ ÙÙ ÙÙÙ
Ø© âthisâ ÙÙØ·:
let user = {
firstName: "John",
say(phrase) {
alert(`â${phrase}, ${this.firstName}!â`);
}
};
let say = user.say.bind(user);
say("Hello"); // â«Hello, John!â (Ù
ÙØ±Ùر اÙÙ
ÙØ¹Ø§Ù
Ù "Hello" Ø¥ÙÙ say)
say("Bye"); // â«Bye, John!â (Ù
ÙØ±Ùر اÙÙ
عاÙ
Ù "Bye" Ø¥ÙÙ say)
ØªØ§Ø¨ÙØ¹ Ù
ÙÙØ¯: âbindAllâ
ÙÙ ÙØ§Ù ÙÙÙØ§Ø¦Ù ØªÙØ§Ø¨Ùع ÙØ«Ùرة ÙØ£Ø±Ø¯Ùا تÙ
Ø±ÙØ±Ùا ÙÙØ§ ÙÙÙØ§Ù Ø¨ÙØ«Ø±Ø©Ø ÙØ±Ø¨ÙÙ
ا ÙØ±Ø¨Ø·Ùا ÙÙÙÙØ§ ÙÙ ØÙÙØ©:
for (let key in user) {
if (typeof user[key] == 'function') {
user[key] = user[key].bind(user);
}
}
JavaScript libraries also provide functions for convenient mass binding , e.g. _.bindAll(object, methodNames) in lodash.
## Ø§ÙØ¯ÙØ§Ù Ø§ÙØ¬Ø²Ø¦ÙØ©
Ø·ÙØ§Ù ÙØ°Ù اÙÙØªØ±Ø© ÙÙ
ÙÙÙØ§ÙØ´ Ø´ÙØ¦Ùا Ø¥ÙÙØ§ ربط `âthisâ`. ÙÙÙØ¶ÙÙ Ø´ÙØ¦Ùا آخر عÙÙ Ø§ÙØ·Ø§ÙÙØ©.
ÙÙ
ÙÙ Ø£ÙØ¶Ùا Ø£Ù ÙØ±Ø¨Ø· اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª ÙÙÙØ³ `âthisâ` ÙØØ³Ø¨. صØÙØ Ø£ÙÙØ§ ÙØ§Ø¯Ø±Ùا Ù
ا ÙÙØ¹Ù ذÙ٠إÙÙØ§ Ø£ÙÙ Ø§ÙØ£Ù
ر Ù
ÙÙØ¯ Ù٠أØÙØ§Ù Ø¹ØµÙØ¨Ø©.
ØµÙØ§ØºØ© `âbindâ` اÙÙØ§Ù
ÙØ©:
```
let bound = func.bind(context, [arg1], [arg2], ...);
```
ÙÙ٠تسÙ
Ø ÙÙØ§ بربط Ø§ÙØ³Ùا٠ÙÙÙÙÙ `âthisâ` ÙØ§ÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª Ø§ÙØ£ÙÙÙ ÙÙ Ø§ÙØ¯Ø§ÙØ©.
ÙØ±Ù Ù
ثاÙÙØ§: Ø¯Ø§ÙØ© ضرب `âmul(a, b)â`:
```
function mul(a, b) {
return a * b;
}
```
ÙÙÙØ³ØªØ¹Ù
Ù `âbindâ` ÙÙØµÙع Ø¯Ø§ÙØ© «ضرب Ù٠اثÙÙÙ» `âdoubleâ` ØªØªÙØ®Ø° تÙÙ Ø£Ø³Ø§Ø³ÙØ§ ÙÙØ§:
```
function mul(a, b) {
return a * b;
}
let double = mul.bind(null, 2);
alert( double(3) ); // = mul(2, 3) = 6
alert( double(4) ); // = mul(2, 4) = 8
alert( double(5) ); // = mul(2, 5) = 10
```
ÙØµÙع استدعاء `âmul.bind(null, 2)â` Ø¯Ø§ÙØ©Ù Ø¬Ø¯ÙØ¯Ø© `âdoubleâ` تÙÙ
Ø±ÙØ± Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª Ø¥ÙÙ `âmulâ` ÙØªØ¶Ø¨Ø· `ânullâ` ÙÙÙÙÙ Ø§ÙØ³Ùا٠Ù`â2â` ÙÙÙÙ٠اÙÙ
ÙØ¹Ø§Ù
Ù Ø§ÙØ£ÙÙ. Ø§ÙØ¨Ø§ÙÙ Ù
Ù Ù
ÙØ¹Ø§Ù
ÙØ§Øª ÙÙÙ
Ø±ÙØ± «ÙÙ
ا ÙÙ».
ÙØ°Ø§ Ù
ا ÙØ³Ù
ÙÙÙ [باستعÙ
Ø§Ù Ø§ÙØ¯ÙØ§Ù Ø§ÙØ¬Ø²Ø¦ÙØ©](https://en.wikipedia.org/wiki/Partial_application) -- Ø£Ù ÙØµÙع Ø¯Ø§ÙØ© بعد ضبط بعض Ù
ÙØ¹Ø§Ù
ÙØ§Øª ÙØ§ØØ¯Ø© ØºÙØ±Ùا.
Please note that we actually don't use `this` here. But `bind` requires it, so we must put in something like `null`.
Ø§ÙØ¯Ø§ÙØ© `âtripleâ` أسÙÙ٠تضرب اÙÙÙÙ
Ø© ÙÙ Ø«ÙØ§Ø«Ø©:
```
function mul(a, b) {
return a * b;
}
let triple = mul.bind(null, 3);
alert( triple(3) ); // = mul(3, 3) = 9
alert( triple(4) ); // = mul(3, 4) = 12
alert( triple(5) ); // = mul(3, 5) = 15
```
ÙÙÙÙ ÙÙ
اذا ÙØµÙع Ø§ÙØ¯ÙØ§Ù Ø§ÙØ¬Ø²Ø¦ÙØ© أصÙÙØ§Ø ÙØ¹Ø§Ø¯Ø©ÙØ!
اÙÙØ§Ø¦Ø¯Ø© ÙÙ Ø¥ÙØ´Ø§Ø¡ Ø¯Ø§ÙØ© Ù
ستÙÙØ© ÙÙØ§ اسÙ
سÙ٠اÙÙØ±Ø§Ø¡Ø© (`âdoubleâ` Ø£Ù `âtripleâ`)Ø ÙÙØ³ØªØ¹Ù
ÙÙØ§ دÙÙ ØªÙØ¯ÙÙ
اÙÙ
ÙØ¹Ø§Ù
Ù Ø§ÙØ£ÙÙ ÙÙ ÙÙÙ Ù
رة إذ Ø¶Ø¨Ø·ÙØ§ ÙÙÙ
ت٠باستعÙ
ا٠`âbindâ`.
ÙÙÙØ§Ù ØØ§Ùات أخر٠ÙÙÙØ¯Ùا Ø§ÙØ§Ø³ØªØ¹Ù
Ø§Ù Ø§ÙØ¬Ø²Ø¦Ù ÙØ°Ø§ ØÙÙ ÙØØªØ§Ø¬ ÙØ³Ø®Ø© Ø£ÙØ«Ø± ØªØØ¯ÙØ¯ÙØ§ Ù
Ù Ø¯Ø§ÙØ© عاÙ
ÙØ© Ø¬Ø¯ÙØ§Ø ÙÙØ³ÙÙ٠استعÙ
اÙÙØ§ ÙÙØ·.
ÙÙ
Ø«ÙÙØ§ ÙÙ
ÙÙ Ø£Ù ÙØµÙع Ø§ÙØ¯Ø§ÙØ© `âsend(from, to, text)â`. ÙØ¨Ø¹Ø¯Ùا ÙÙ ÙØ§Ø¦Ù اÙÙ
ستخدÙ
`âuserâ` ÙØµÙع ÙØ³Ø®Ø© Ø¬Ø²Ø¦ÙØ© عÙÙØ§: `âsendTo(to, text)â` ØªÙØ±Ø³Ù اÙÙØµÙ Ù
٠اÙÙ
ستخدÙ
Ø§ÙØØ§ÙÙ.
## Ø§ÙØ¬Ø²Ø¦ÙØ©Ø Ø¨Ø¯ÙÙ Ø§ÙØ³ÙاÙ
Ù
اذا ÙÙ Ø£Ø±Ø¯ÙØ§ Ø£Ù ÙØ¶Ø¨Ø· بعض اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª ÙÙÙ٠دÙÙ Ø§ÙØ³Ùا٠`âthisâ`Ø Ù
Ø«ÙÙØ§ ÙØ³ØªØ¹Ù
ÙÙØ§ ÙØªØ§Ø¨Ùع Ø£ØØ¯ اÙÙØ§Ø¦Ùات.
ØªØ§Ø¨ÙØ¹ `âbindâ` Ø§ÙØ£ØµÙÙ Ù٠اÙÙØºØ© ÙØ§ ÙØ³Ù
Ø Ø¨Ø°ÙÙØ ÙÙ
ستØÙ٠أ٠ÙÙØ²ÙÙ Ø§ÙØ³Ùا٠ÙÙØ¶Ø¹ اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª ÙÙØ·.
ÙÙÙ ÙØØ³Ù Ø§ÙØØ¸ ÙÙÙ
ÙÙÙØ§ ØµÙØ¹ Ø¯Ø§ÙØ© Ù
ÙØ³Ø§Ø¹Ø¯Ø© `âpartialâ` تربط اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª ÙÙØ·.
ÙÙØ°Ø§ تÙ
اÙ
ÙØ§:
```
function partial(func, ...argsBound) {
return function(...args) { // (*)
return func.call(this, ...argsBound, ...args);
}
}
// Ø§ÙØ§Ø³ØªØ¹Ù
اÙ:
let user = {
firstName: "John",
say(time, phrase) {
alert(`â[${time}] ${this.firstName}: ${phrase}!â`);
}
};
// ÙÙØ¶ÙÙ ØªØ§Ø¨ÙØ¹Ùا جزئÙÙØ§ بعد ضبط اÙÙÙØª
user.sayNow = partial(user.say, new Date().getHours() + ':' + new Date().getMinutes());
user.sayNow("Hello");
// ÙØ³ÙØ¸ÙØ± Ù
ا ÙØ´Ø¨Ù Ø§ÙØ¢ØªÙ:
// [10:00] John: Hello!
```
ÙØ§ØªÙج Ø§Ø³ØªØ¯Ø¹Ø§Ø¦ÙØ§ ÙÙØ¯Ø§ÙØ© `âpartial(func[, arg1, arg2...])â` Ù٠غÙÙØ§Ù `â(*)â` ÙØ³ØªØ¯Ø¹Ù Ø§ÙØ¯Ø§ÙØ© `âfuncâ` ÙÙØ°Ø§:
- ÙØªØ±Ù `âthisâ` ÙÙ
ا ÙÙ (ÙØªÙÙÙ ÙÙÙ
ت٠`âuserâ` Ø¯Ø§Ø®Ù Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ `âuser.sayNowâ`)
- Ø«Ù
Ù ÙÙ
Ø±ÙØ± ÙÙØ§ `â...argsBoundâ`: أ٠اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª Ù
٠استدعاء `âpartialâ` â(`â"10:00"â`)
- ÙØ«Ù
Ù ÙÙ
Ø±ÙØ± ÙÙØ§ `â...argsâ`: اÙÙ
ÙØ¹Ø§Ù
ÙØ§Øª اÙÙ
Ù
Ø±ÙØ±Ø© ÙÙØºÙÙØ§Ù (`â"Hello"â`)
Ø³Ø§Ø¹Ø¯ÙØ§ Ù
ÙØ¹Ø§Ù
Ù Ø§ÙØªÙØ²ÙØ¹ ÙØ«ÙØ±ÙØ§ ÙÙØ§Ø Ø£Ù
ÙØ§Ø
ÙÙ
ا Ø£ÙÙ ÙÙØ§Ù Ø´ÙÙØ±Ø© [`â_.partial`](https://lodash.com/docs#partial) Ù٠اÙÙ
ÙØªØ¨Ø© lodash.
## Ù
ÙØ®Øµ
ÙÙØ¹Ùد Ø§ÙØªØ§Ø¨Ùع `âfunc.bind(context, ...args)â` Â«ÙØ³Ø®Ø© Ù
Ø±Ø¨ÙØ·Ø©Â» Ù
Ù Ø§ÙØ¯Ø§ÙØ© `âfuncâ` بعد ضبط Ø³ÙØ§ÙÙØ§ `âthisâ` ÙÙ
ÙØ¹Ø§Ù
ÙØ§ØªÙا Ø§ÙØ£ÙÙÙ (ÙÙ ØØ§Ù Ù
Ø±ÙØ±ÙØ§ÙØ§).
عادة٠Ù
ا ÙØ³ØªØ¹Ù
Ù `âbindâ` ÙÙØ¶Ø¨Ø· `âthisâ` Ø¯Ø§Ø®Ù ØªØ§Ø¨ÙØ¹ ÙØ£ØØ¯ اÙÙØ§Ø¦ÙØ§ØªØ ÙÙÙ
Ù٠أ٠ÙÙ
Ø±ÙØ± Ø§ÙØªØ§Ø¨Ùع ذÙ٠إÙÙ Ù
ÙØ§Ù Ø¢Ø®Ø±Ø Ù
Ø«ÙÙØ§ Ø¥ÙÙ `âsetTimeoutâ`.
ÙØÙÙ ÙØ¶Ø¨Ø· Ø¨Ø¹Ø¶ÙØ§ Ù
Ù Ù
ÙØ¹Ø§Ù
ÙØ§Øª Ø¥ØØ¯Ù Ø§ÙØ¯ÙØ§ÙØ ÙÙÙ٠اÙÙØ§ØªØ¬ (ÙÙÙ Ø£ÙØ«Ø± ØªÙØµÙÙÙØ§) Ø¯Ø§ÙØ©Ù ÙØ¯Ø¹ÙÙØ§ Ø¨Ø§ÙØ¯Ø§ÙØ© *Ø§ÙØ¬Ø²Ø¦ÙØ©* Ø£Ù *اÙÙ
طبÙÙØ© Ø¨ÙØÙ٠جزئÙ* _partially applied_.
تÙÙÙØ¯Ùا ÙØ°Ù Ø§ÙØ¯ÙØ§Ù Ø§ÙØ¬Ø²Ø¦ÙØ© ØÙÙ ÙØ§ ÙØ±Ùد ØªÙØ±Ø§Ø± ذات اÙÙØ³ÙØ· Ù
Ø±Ø§Ø±ÙØ§ ÙØªÙØ±Ø§Ø±ÙØ§Ø Ù
Ø«Ù Ø¯Ø§ÙØ© `âsend(from, to)â` ØÙØ« ÙØ¬Ø¨ Ø£Ù ÙØ¨ÙÙ `âfromâ` ÙÙ
ا ÙÙ ÙÙ Ù
ÙÙ
ÙØªÙا ÙØ°ÙØ ÙÙØ£Ø®Ø° Ø¯Ø§ÙØ© Ø¬Ø²Ø¦ÙØ© ÙÙØªØ¹Ø§Ù
Ù Ø¨ÙØ§.
## تÙ
ارÙÙ
### Ø¯Ø§ÙØ© ربط عÙ٠أÙÙÙØ§ ØªØ§Ø¨ÙØ¹
_Ø§ÙØ£ÙÙ
ÙØ©: 5_
Ù
ا ÙØ§ØªØ¬ ÙØ°Ù Ø§ÙØ´ÙÙØ±Ø©Ø
```
function f() {
alert( this ); // Ø
}
let user = {
g: f.bind(null)
};
user.g();
```
#### Ø§ÙØÙ
Ø§ÙØ¬Ùاب ÙÙ: `ânullâ`.
Ø³ÙØ§Ù Ø¯Ø§ÙØ© Ø§ÙØ±Ø¨Ø· Ù
ÙØªÙب ÙÙ Ø§ÙØ´ÙÙØ±Ø© (hard-coded) ÙÙØ§ ÙÙ
Ù٠تغÙÙØ±Ù ÙØ§ØÙÙØ§ بأÙÙ Ø´ÙÙ Ù
Ù Ø§ÙØ£Ø´ÙاÙ.
ÙØØªÙÙ Ù٠شغÙÙÙØ§ `âuser.g()â` ÙØ³ØªÙØ³ØªØ¯Ø¹Ù Ø§ÙØ¯Ø§ÙØ© Ø§ÙØ£ØµÙÙØ© بضبط `âthis=nullâ`.
### ربطة ثاÙÙØ©
_Ø§ÙØ£ÙÙ
ÙØ©: 5_
ÙÙ ÙÙ
ÙÙ Ø£Ù ÙØºÙÙØ± ÙÙÙ
Ø© `âthisâ` باستعÙ
ا٠ربطة إضاÙÙØ©Ø
Ù
ا ÙØ§ØªØ¬ ÙØ°Ù Ø§ÙØ´ÙÙØ±Ø©Ø
```
function f() {
alert(this.name);
}
f = f.bind( {name: "John"} ).bind( {name: "Ann" } );
f();
```
#### Ø§ÙØÙ
Ø§ÙØ¬Ùاب ÙÙ: **John**.
```
function f() {
alert(this.name);
}
f = f.bind( {name: "John"} ).bind( {name: "Pete"} );
f(); // John
```
ÙØ§ ÙØªØ°ÙÙØ± ÙØ§Ø¦Ù [Ø¯Ø§ÙØ© Ø§ÙØ±Ø¨Ø·](https://tc39.github.io/ecma262/#sec-bound-function-exotic-objects) Â«Ø§ÙØ¯Ø®ÙÙ» (Ø§ÙØ°Ù ÙÙØ¹Ùد٠`âf.bind(...)â`) Ø§ÙØ³Ùا٠(Ù
ع اÙÙÙØ³Ø·Ø§Ø¡ Ø¥Ù Ù
ÙØ±Ùرت) - ÙØ§ ÙØªØ°ÙÙØ± ÙØ°Ø§ ÙÙÙ٠إÙÙ ÙÙØª Ø¥ÙØ´Ø§Ø¡ اÙÙØ§Ø¦Ù.
Ø£Ù: ÙØ§ ÙÙ
Ù٠إعادة ربط Ø§ÙØ¯ÙاÙ.
### Ø®Ø§ØµÙØ© Ø§ÙØ¯Ø§ÙØ© بعد Ø§ÙØ±Ø¨Ø·
_Ø§ÙØ£ÙÙ
ÙØ©: 5_
تÙ
تÙÙ Ø®Ø§ØµÙØ© Ø¥ØØ¯Ù Ø§ÙØ¯Ùا٠ÙÙÙ
Ø© Ù
ا. Ù٠ستتغÙÙØ± بعد `âbindâ`Ø ÙØ¹Ù
Ø ÙÙ
Ø§Ø°Ø§Ø ÙØ§Ø ÙÙ
اذاØ
```
function sayHi() {
alert( this.name );
}
sayHi.test = 5;
let bound = sayHi.bind({
name: "John"
});
alert( bound.test ); // Ù
ا اÙÙØ§ØªØ¬Ø ÙÙ
اذاØ
```
#### Ø§ÙØÙ
Ø§ÙØ¬Ùاب ÙÙ: `âundefinedâ`.
ÙØ§ØªÙج `âbindâ` ÙÙ ÙØ§Ø¦Ù Ø¢Ø®Ø±Ø ÙÙÙØ³ ÙÙ ÙØ°Ø§ اÙÙØ§Ø¦Ù Ø®Ø§ØµÙØ© `âtestâ`.
### أصÙÙØ ÙØ°Ù Ø§ÙØ¯Ø§ÙØ© Ø§ÙØªÙ ÙØ¶Ùع «this» Ù
ÙÙØ§
_Ø§ÙØ£ÙÙ
ÙØ©: 5_
عÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ `âaskPassword()â` ÙÙ Ø§ÙØ´ÙÙØ±Ø© أسÙÙÙ ÙØØµ ÙÙÙ
Ø© Ø§ÙØ³Ø±Ø Ø«Ù
٠استدعاء `âuser.loginOk/loginFailâ` ØØ³Ø¨ ÙØªÙجة اÙÙØØµ.
ÙÙÙÙ Ø£Ø«ÙØ§Ø¡ Ø§ÙØªÙÙÙØ° ÙØ±Ù خطأÙ. ÙÙ
اذاØ
أصÙÙØ Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ°Ù ÙÙÙ `â(*)â` ÙØªØ¹Ù
Ù Ø§ÙØ´ÙÙØ±Ø© ÙÙ
ا ÙØ¬Ø¨ (تغÙÙØ± بÙÙØ© Ø§ÙØ£Ø³Ø·Ø± Ù
Ù
ÙÙØ¹).
```
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'John',
loginOk() {
alert(`â${this.name} logged inâ`);
},
loginFail() {
alert(`â${this.name} failed to log inâ`);
},
};
askPassword(user.loginOk, user.loginFail); // (*)
```
#### Ø§ÙØÙ
سبب Ø§ÙØ®Ø·Ø£ Ù٠أÙÙ Ø§ÙØ¯Ø§ÙØ© `âaskâ` تستÙÙ
Ø§ÙØ¯Ø§ÙتÙÙ `âloginOk/loginFailâ` دÙÙ ÙØ§Ø¦ÙÙÙÙ
ا.
ÙÙ
ت٠Ù
ا استدعتÙÙ
Ø§Ø ØªÙØ¹Ø¯Ù `âthis=undefinedâ` Ø¨Ø·Ø¨ÙØ¹ØªÙا.
عÙÙÙØ§ ربط Ø§ÙØ³ÙاÙ!
```
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'John',
loginOk() {
alert(`â${this.name} logged inâ`);
},
loginFail() {
alert(`â${this.name} failed to log inâ`);
},
};
// (*)\maskPassword(user.loginOk.bind(user), user.loginFail.bind(user));
```
Ø§ÙØ¢Ù صارت تعÙ
Ù.
Ø£ÙØ بطرÙÙØ© أخرÙ:
```
//...
askPassword(() => user.loginOk(), () => user.loginFail());
```
ÙØ°Ù Ø§ÙØ´ÙÙØ±Ø© تعÙ
Ù ÙØ¹Ø§Ø¯Ø©Ù Ù
ا تÙÙ٠سÙÙØ© اÙÙØ±Ø§Ø¡Ø© Ø£ÙØ¶Ùا.
ÙÙÙÙÙÙØ§ ÙÙ ØØ§Ùات Ø£ÙØ«Ø± تعÙÙØ¯Ùا ØªØµÙØ± Ø£ÙÙÙ Ù
ÙØ«ÙÙÙØ©Ø Ù
ث٠Ù٠تغÙÙØ± اÙÙ
ØªØºÙØ± `âuserâ` *بعدÙ
ا* Ø§Ø³ØªÙØ¯Ø¹Ùت Ø§ÙØ¯Ø§ÙØ© `âaskPasswordâ` Ù*ÙØ¨Ù* Ø£Ù ÙÙØ¬Ùب Ø§ÙØ²Ø§Ø¦Ø± عÙÙ Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ `â() => user.loginOk()â`.
### استعÙ
Ø§Ù Ø§ÙØ¯ÙØ§Ù Ø§ÙØ¬Ø²Ø¦ÙØ© ÙÙÙÙØ¬ اÙÙ
ستخدÙ
ÙØ°Ø§ Ø§ÙØªÙ
رÙÙ Ù
عÙÙØ¯ Ø£ÙØ«Ø± Ù
٠سابÙÙØ بÙÙÙÙ.
ÙÙØ§ تعدÙÙ ÙØ§Ø¦Ù `âuserâ`Ø ÙØµØ§Ø± ÙÙÙ Ø¨Ø¯Ù Ø§ÙØ¯Ø§ÙتÙÙ `âloginOk/loginFailâ` Ø¯Ø§ÙØ© ÙØ§ØØ¯Ø© `âuser.login(true/false)â`.
Ù
ا Ø§ÙØ£Ø´Ùاء Ø§ÙØªÙ ÙÙ
Ø±ÙØ±Ùا Ø¥ÙÙ `âaskPasswordâ` ÙÙ Ø§ÙØ´ÙÙØ±Ø© أسÙÙÙ ÙØªØ³ØªØ¯Ø¹Ù `âuser.login(true)â` باستعÙ
ا٠`âokâ` ÙØªØ³ØªØ¯Ø¹Ù `âuser.login(false)â` باستعÙ
ا٠`âfailâ`Ø
```
function askPassword(ok, fail) {
let password = prompt("Password?", '');
if (password == "rockstar") ok();
else fail();
}
let user = {
name: 'John',
login(result) {
alert( this.name + (result ? ' logged in' : ' failed to log in') );
}
};
askPassword(?, ?); // Ø (*)
```
ÙØ¬Ø¨ أ٠تعدÙÙ Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ°Ù عÙÙÙ `â(*)â` ÙÙØ· ÙØ§ ØºÙØ±.
#### Ø§ÙØÙ
1. ÙØ³ØªØ¹Ù
Ù Ø¯Ø§ÙØ© غاÙÙÙØ©... سÙÙ
ÙØ© ÙÙ Ø£Ø±Ø¯ÙØ§ Ø§ÙØªÙصÙÙ:
```
askPassword(() => user.login(true), () => user.login(false));
```
ÙÙØ°Ø§ تأخذ `âuserâ` Ù
٠اÙÙ
ØªØºÙØ±Ø§Øª Ø§ÙØ®Ø§Ø±Ø¬ÙØ© ÙØªÙشغÙÙ Ø§ÙØ¯ÙØ§Ù Ø¨Ø§ÙØ·Ø±ÙÙØ© Ø§ÙØ¹Ø§Ø¯ÙØ©.
2. Ø£Ù ÙØµÙع Ø¯Ø§ÙØ© Ø¬Ø²Ø¦ÙØ© Ù
Ù `âuser.loginâ` تستعÙ
Ù `âuserâ` Ø³ÙØ§ÙÙØ§ ÙÙØ§ ÙÙØ¶Ø¹ Ù
ÙØ¹Ø§Ù
ÙÙØ§ Ø§ÙØ£ÙÙ ÙÙ
ا ÙØ¬Ø¨:
```
askPassword(user.login.bind(user, true), user.login.bind(user, false));
```
ترجÙ
Ø© -ÙØ¨ØªØµØ±Ù- ÙÙÙØµÙ [Function binding](https://javascript.info/bind) Ù
Ù ÙØªØ§Ø¨ [The JavaScript language](https://javascript.info/js)
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)