زÙ
اÙÛ Ú©Ù Ù
ØªØ¯ÙØ§Û تابع را ب٠عÙÙØ§Ù callback پاس Ù
ÛâØ¯ÙÛÙ
Ø Ø¨Ø±Ø§Û Ù
ثا٠ب٠setTimeoutØ ÛÚ© Ù
Ø´Ú©Ù Ø´ÙØ§Ø®ØªÙ Ø´Ø¯Ù ÙØ¬Ùد دارد: «از دست داد٠this».
در اÛÙ ÙØµÙ ٠ا راÙâÙØ§ÛÛ Ø±Ø§ Ø¨Ø±Ø§Û Ø±ÙØ¹ Ø¢Ù Ø®ÙØ§ÙÛÙ Ø¯ÛØ¯.
از دست داد٠âthisâ
Ù
ا از ÙØ¨Ù دربار٠از دست داد٠this Ù
ثاÙâÙØ§ÛÛ Ø±Ø§ Ø¯ÛØ¯ÙâØ§ÛÙ
. زÙ
اÙÛ Ú©Ù ÛÚ© Ù
تد جاÛÛ Ø¨Ù ØºÛØ± از Ø´ÛØ¡ Ø®ÙØ¯Ø´ پاس Ø¯Ø§Ø¯Ù Ø´ÙØ¯Ø this از دست Ù
ÛâØ±ÙØ¯.
ÚÛØ²Û Ú©Ù Ù
Ù
ک٠است با setTimeout Ø§ØªÙØ§Ù Ø¨ÛØ§Ùتد اÛÙØ¬Ø§ Ø¢ÙØ±Ø¯Ù شدÙ:
let user = {
firstName: "John",
sayHi() {
alert(`Ø³ÙØ§Ù
Ø ${this.firstName}!`);
}
};
setTimeout(user.sayHi, 1000); // !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 Ù
ÛâØ´ÙØ¯.
Ú©Ø§Ø±Û Ú©Ù Ø§ÙØ¬Ø§Ù Ù ÛâØ´ÙØ¯ Ú©Ø§Ù ÙØ§ ٠ع٠ÙÙÛ Ø§Ø³ØªØ Ù Ø§ Ù ÛâØ®ÙØ§ÙÛÙ ÛÚ© ٠تد Ø´ÛØ¡ را جاÛÛ Ø¯Ûگر (اÛÙØ¬Ø§Ø ب٠ز٠اÙâØ¨ÙØ¯) Ú©Ù ÙØ±Ø§Ø®ÙاÙÛ Ø®ÙØ§Ùد شد پاس دÙÛÙ . ÚÚ¯ÙÙ٠٠ط٠ئ٠شÙÛ٠ک٠با ز٠ÛÙ٠درست ÙØ±Ø§Ø®ÙاÙÛ Ù ÛâØ´ÙØ¯Ø
راÙâØÙ 1: Ø¯Ø±Ø¨Ø±Ú¯ÛØ±ÙدÙ
سادÙâØªØ±Û٠راÙâØÙ Ø§Ø³ØªÙØ§Ø¯Ù از ÛÚ© تابع Ø¯Ø±Ø¨Ø±Ú¯ÛØ±Ùد٠است:
let user = {
firstName: "John",
sayHi() {
alert(`Ø³ÙØ§Ù
Ø ${this.firstName}!`);
}
};
setTimeout(function() {
user.sayHi(); // !John ØØ³ÙاÙ
}, 1000);
ØØ§Ùا کار Ù
ÛâÚ©ÙØ¯Ø ÚÙÙ user را از Ù
ØÛØ· ÙØºÙÛ Ø¨ÛØ±ÙÙÛ Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙØ¯ ٠سپس Ø¨Ù Ø·ÙØ± Ù
عÙ
ÙÙÛ Ù
تد را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙØ¯.
اÛÙ Ûکسا٠ا٠ا Ú©ÙØªØ§ÙâØªØ± است:
setTimeout(() => user.sayHi(), 1000); // !John ØØ³ÙاÙ
Ù ÙØ§Ø³Ø¨ Ø¨ÙØ¸Ø± Ù ÛâØ±Ø³Ø¯ ا٠ا ÛÚ© Ø¢Ø³ÛØ¨âÙ¾Ø°ÛØ±Û Ø¬Ø²Ø¦Û Ù Ù Ú©Ù Ø§Ø³Øª در ساختار کد ٠ا ÙÙ Ø§ÛØ§Ù Ø´ÙØ¯.
اگر ÙØ¨Ù از اÛÙÚ©Ù setTimeout ÙØ¹Ø§Ù Ø´ÙØ¯ (ØªØ§Ø®ÛØ± ÛÚ© ثاÙÛÙâØ§Û ÙØ¬Ùد دارد!) user Ù
ÙØ¯Ø§Ø±Ø´ تغÛÛØ± Ú©ÙØ¯ ÚÙØ سپس ÙØ§Ú¯ÙØ§ÙØ Ø´ÛØ¡ اشتباÙÛ Ø±Ø§ ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙØ¯!
let user = {
firstName: "John",
sayHi() {
alert(`Ø³ÙØ§Ù
Ø ${this.firstName}!`);
}
};
setTimeout(() => user.sayHi(), 1000);
// ...در ØÛÙ 1 ثاÙÛ٠تغÛÛØ± Ù
ÛâÚ©ÙØ¯ user Ù
ÙØ¯Ø§Ø±
user = {
sayHi() { alert("!setTimeout دÛگر در user ÛÚ©"); }
};
// !setTimeout دÛگر در user ÛÚ©
راÙâØÙ Ø¨Ø¹Ø¯Û ØªØ¶Ù ÛÙ Ù ÛâÚ©ÙØ¯ Ú©Ù ÚÙÛÙ ÚÛØ²Û Ø§ØªÙØ§Ù ÙÛØ§Ùتد.
راÙâØÙ 2: ٠تد bind
تابعâÙØ§ ÛÚ© Ù
تد درÙÙÛ bind Ø¯Ø§Ø±ÙØ¯ ک٠اÙ
کا٠ثابت کرد٠this را Ø§ÛØ¬Ø§Ø¯ Ù
ÛâÚ©ÙØ¯.
سÛÙØªÚ©Ø³ پاÛÙâØ§Û Ø¢Ù:
// سÛÙØªÚ©Ø³ Ù¾ÛÚÛØ¯ÙâØªØ± Ú©Ù
Û Ø¨Ø¹Ø¯ØªØ± ÙØ±Ø§ Ù
ÛâØ±Ø³Ø¯
let boundFunc = func.bind(context);
ÙØªÛجÙâÛ func.bind(context) ÛÚ© Â«Ø´ÛØ¡ بÛگاÙÙ» تابعâÙ
اÙÙØ¯ خاص است Ú©Ù Ù
ÛâØªÙØ§Ùد ب٠عÙÙØ§Ù تابع ÙØ±Ø§Ø®ÙاÙÛ Ø´ÙØ¯ Ù Ø¨Ù Ø·ÙØ± Ù¾ÙÙØ§ÙÛ ÙØ±Ø§Ø®ÙاÙÛ Ø±Ø§ با ØªÙØ¸ÛÙ
this=context ب٠func Ù
ÙØªÙÙ Ú©ÙØ¯.
Ø¨Ù Ø¹Ø¨Ø§Ø±ØªÛ Ø¯ÛÚ¯Ø±Ø ÙØ±Ø§Ø®ÙاÙÛ boundFunc Ù
اÙÙØ¯ func با this ØªØ«Ø¨ÛØª شد٠است.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ اÛÙØ¬Ø§ funcUser ÙØ±Ø§Ø®ÙاÙÛ Ø±Ø§ با this=user ب٠func Ù
ÙØªÙÙ Ù
ÛâÚ©ÙØ¯:
let user = {
firstName: "John"
};
function func() {
alert(this.firstName);
}
let funcUser = func.bind(user);
funcUser(); // John
اÛÙØ¬Ø§ func.bind(user) ب٠عÙÙØ§Ù «ÛÚ© ÙÙØ¹ Ù¾ÛÙÙØ¯ زد٠شدÙ» از func با this=user Ø´ÙØ§Ø®ØªÙ Ù
ÛâØ´ÙØ¯.
تÙ
اÙ
آرگÙÙ
اÙâÙØ§ «بدÙ٠تغÛÛØ±Â» ب٠تابع اصÙÛ func Ù
ÙØªÙÙ Ù
ÛâØ´ÙÙØ¯Ø Ø¨Ø±Ø§Û Ù
ثاÙ:
let user = {
firstName: "John"
};
function func(phrase) {
alert(phrase + 'Ø ' + this.firstName);
}
// Ù¾ÛÙÙØ¯ بز٠user اÛ٠را بÙ
let funcUser = func.bind(user);
funcUser("Ø³ÙØ§Ù
"); // (this=user آرگÙÙ
Ø§Ù Â«Ø³ÙØ§Ù
» پاس داد٠شد Ù) John ØØ³ÙاÙ
ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ با ÛÚ© ٠تد Ø´ÛØ¡ Ø§Ù ØªØØ§Ù Ú©ÙÛÙ :
let user = {
firstName: "John",
sayHi() {
alert(`Ø³ÙØ§Ù
Ø ${this.firstName}!`);
}
};
let sayHi = user.sayHi.bind(user); // (*)
// Ù
ÛâØªÙØ§ÙÛÙ
آ٠را بدÙÙ Ø´ÛØ¡ اجرا Ú©ÙÛÙ
sayHi(); // !John ØØ³ÙاÙ
setTimeout(sayHi, 1000); // !John ØØ³ÙاÙ
// در ØÛÙ 1 ثاÙÛ٠تغÛÛØ± Ú©ÙØ¯ user ØØªÛ اگر Ù
ÙØ¯Ø§Ø±
// Ø±Ø¬ÙØ¹ Ù
ÛâÚ©ÙØ¯ user از Ù
ÙØ¯Ø§Ø±Û ک٠از ÙØ¨Ù Ù¾ÛÙÙØ¯ Ø²Ø¯Ù Ø´Ø¯Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙØ¯ Ú©Ù Ø¨Ù Ø´ÛØ¡ ÙØ¯ÛÙ
Û sayHi تابع
user = {
sayHi() { alert("!setTimeout دÛگر در user ÛÚ©"); }
};
در خط (*) Ù
ا Ù
تد user.sayHi را Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙÛÙ
٠آ٠را ب٠user Ù¾ÛÙÙØ¯ Ù
ÛâØ²ÙÛÙ
. sayHi ÛÚ© تابع «پÛÙÙØ¯ زد٠شدÙ» است Ú©Ù Ù
ÛâØªÙØ§Ùد ب٠تÙÙØ§ÛÛ ÙØ±Ø§Ø®ÙاÙÛ Ø´ÙØ¯ ÛØ§ ب٠setTimeout ÙØ±Ø³ØªØ§Ø¯Ù Ø´ÙØ¯ â Ù
ÙÙ
ÙÛØ³ØªØ زÙ
ÛÙÙ ÙÙ
ÛØ´Ù درست Ø®ÙØ§Ùد Ø¨ÙØ¯.
اÛÙØ¬Ø§ Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
ببÛÙÛÙ
آرگÙÙ
اÙâÙØ§ÛÛ Ú©Ù Ù¾Ø§Ø³ Ø¯Ø§Ø¯Ù Ø´Ø¯ÙØ¯ «بدÙ٠تغÛÛØ±Â» Ù
Ø§ÙØ¯Ùد Ù ÙÙØ· this ØªÙØ³Ø· bind ثابت شد٠است:
let user = {
firstName: "John",
say(phrase) {
alert(`${phrase}Ø ${this.firstName}!`);
}
};
let say = user.say.bind(user);
say("Ø³ÙØ§Ù
"); // (پاس داد٠شد say آرگÙÙ
Ø§Ù Â«Ø³ÙØ§Ù
» بÙ) !John ØØ³ÙاÙ
say("Ø®Ø¯Ø§ØØ§Ùظ"); // (پاس داد٠شد say آرگÙÙ
Ø§Ù Â«Ø®Ø¯Ø§ØØ§Ùظ» بÙ) !John ØØ®Ø¯Ø§ØØ§Ùظ
bindAllاگر ÛÚ© Ø´ÛØ¡ تعداد Ø²ÛØ§Ø¯Û ٠تد داشت٠باشد ٠٠ا Ø¨Ø®ÙØ§ÙÛ٠ک٠آ٠را Ø¨Ù ØµÙØ±Øª ÙØ¹Ø§Ù پاس بدÙÛÙ Ø Ù ÛâØªÙØ§ÙÛÙ ØªÙ Ø§Ù Ù ØªØ¯ÙØ§ را با Ø´ÛØ¡ در ÛÚ© ØÙÙÙ Ù¾ÛÙÙØ¯ بزÙÛÙ :
for (let key in user) {
if (typeof user[key] == 'function') {
user[key] = user[key].bind(user);
}
}
کتابخاÙÙâÙØ§Û Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù٠تابعâÙØ§ÛÛ Ø¨Ø±Ø§Û Ù¾ÛÙÙØ¯ Ø²Ø¯Ù Ú¯Ø³ØªØ±Ø¯Ù Ù Ø±Ø§ØØª ارائ٠٠ÛâØ¯ÙØ¯Ø ٠اÙÙØ¯ _.bindAll(object, methodNames) در lodash.
تابعâÙØ§Û جزئÛ
تا ØØ§Ùا Ù
ا ÙÙØ· دربار٠پÛÙÙØ¯ زد٠this ØµØØ¨Øª کردÛÙ
. Ø¨ÛØ§ÛÛØ¯ اÛÙ Ù
ÙØ¶Ùع را Ú©Ù
Û Ø¬ÙÙØªØ± ببرÛÙ
.
Ù
ا Ù٠تÙÙØ§ ØªÙØ§ÙاÛÛ Ù¾ÛÙÙØ¯ زد٠this را دارÛÙ
Ø Ø¨Ùک٠آرگÙÙ
اÙâÙØ§ را ÙÙ
Ù
ÛâØªÙØ§ÙÛÙ
Ù¾ÛÙÙØ¯ بزÙÛÙ
. اÛÙ Ù
ÙØ±Ø¯ Ø¨Ù ÙØ¯Ø±Øª Ø§ØªÙØ§Ù Ù
ÛâØ§ÙØªØ¯ اÙ
ا گاÙÛ Ø¨Ø¯Ø±Ø¯ Ù
ÛâØ®ÙØ±Ø¯.
سÛÙØªÚ©Ø³ کاÙ
Ù bind:
let bound = func.bind(context, [arg1], [arg2], ...);
اÛ٠سÛÙØªÚ©Ø³ اجاز٠Ù
ÛâØ¯ÙØ¯ ک٠زÙ
ÛÙ٠را ب٠عÙÙØ§Ù this ٠آرگÙÙ
اÙâÙØ§Û ابتداÛÛ ØªØ§Ø¨Ø¹ را Ù¾ÛÙÙØ¯ بزÙÛÙ
.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ù
ا ÛÚ© تابع ضرب mul(a, b) دارÛÙ
:
function mul(a, b) {
return a * b;
}
Ø¨ÛØ§ÛÛØ¯ Ø¨Ø±Ø§Û Ø§ÛØ¬Ø§Ø¯ تابع double ک٠بر پاÛ٠تابع ضرب است از bind Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
:
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 Ù
ÛâØ³Ø§Ø²Ø¯ ک٠با ثابت کرد٠null ب٠عÙÙØ§Ù زÙ
ÛÙÙ Ù 2 ب٠عÙÙØ§Ù آرگÙÙ
ا٠اÙÙØ ÙØ±Ø§Ø®ÙاÙÛâÙØ§ را ب٠mul پاس Ù
ÛâØ¯ÙØ¯. آرگÙÙ
اÙâÙØ§Û Ø¨Ø¹Ø¯Û Â«Ø¨Ø¯Ù٠تغÛÛØ±Â» پاس داد٠Ù
ÛâØ´ÙÙØ¯.
اÛÙ Ø¹Ù ÙØ کاربرد تابع Ø¬Ø²Ø¦Û Ø´ÙØ§Ø®ØªÙ Ù ÛâØ´ÙØ¯ â ٠ا با ثابت Ú©Ø±Ø¯Ù Ø¨Ø¹Ø¶Û Ø§Ø² Ù¾Ø§Ø±Ø§Ù ØªØ±ÙØ§Û تابع Ù ÙØ¬ÙØ¯Ø ØªØ§Ø¨Ø¹Û Ø¬Ø¯ÛØ¯ Ù ÛâØ³Ø§Ø²ÛÙ .
ÙØ·Ùا در ÙØ¸Ø± Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯ ک٠در ÙØ§Ùع اÛÙØ¬Ø§ از this Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ
ÛâÚ©ÙÛÙ
. اÙ
ا bind آ٠را ÙÛØ§Ø² دارد پس Ù
ا Ø¨Ø§ÛØ¯ ÚÛØ²Û Ù
اÙÙØ¯ 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
ÚØ±Ø§ ٠ع٠ÙÙØ§ ٠ا ÛÚ© تابع Ø¬Ø²Ø¦Û (partial function) Ù ÛâØ³Ø§Ø²ÛÙ Ø
Ù
Ø²ÛØª Ù
ÙØ¬Ùد اÛ٠است Ú©Ù Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
ÛÚ© تابع Ù
ستÙ٠با اسÙ
Û Ø®ÙØ§Ùا (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.sayNowبرابر باuserاست) - سپس
...argsBoundرا ب٠آ٠٠ÛâØ¯ÙØ¯ â Ø¢Ø±Ú¯Ù٠اÙâÙØ§Û ØØ§ØµÙ از ÙØ±Ø§Ø®ÙاÙÛpartial("10:00") - سپس
...argsرا ب٠آ٠٠ÛâØ¯ÙØ¯ â Ø¢Ø±Ú¯Ù٠اÙâÙØ§ÛÛ Ú©Ù Ø¨Ù Ø¯Ø±Ø¨Ø±Ú¯ÛØ±Ùد٠داد٠شدÙâØ§ÙØ¯ ("Hello")
پس Ø§ÙØ¬Ø§Ù داد٠آ٠با سÛÙØªÚ©Ø³ اسپرد Ø±Ø§ØØª است ÙÙØ
ÙÙ ÚÙÛÙ ÛÚ© Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û Ø¢Ù Ø§Ø¯Ù _.partial از کتابخاÙÙ lodash ÙØ¬Ùد دارد.
Summary
Ù
تد func.bind(context, ...args) ÛÚ© «ÙÙØ¹ Ù¾ÛÙÙØ¯ داد٠شدÙ» از تابع func را برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ ک٠زÙ
ÛÙÙ this ٠اÙÙÛ٠آرگÙÙ
اÙâÙØ§Û داد٠شد٠را ثابت Ù
ÛâÚ©ÙØ¯.
Ù
عÙ
ÙÙØ§ Ù
ا bind را Ø¨Ø±Ø§Û Ø«Ø§Ø¨Øª کرد٠this در ÛÚ© Ù
تد Ø´ÛØ¡ بر رÙÛ Ø¢Ù Ø§Ø¹Ù
ا٠Ù
ÛâÚ©ÙÛÙ
تا Ø¨ØªÙØ§ÙÛÙ
آ٠را جاÛÛ Ù¾Ø§Ø³ دÙÛÙ
. Ø¨Ø±Ø§Û Ù
ثا٠ب٠setTimeout.
ز٠اÙÛ Ú©Ù Ù Ø§ ÚÙØ¯ آرگÙ٠ا٠ÛÚ© تابع Ù ÙØ¬Ùد را ثابت Ù ÛâÚ©ÙÛÙ Ø ØªØ§Ø¨Ø¹ ØØ§ØµÙ (ک٠ک٠تر جا٠ع است) را Ø¨Ù Ø·ÙØ± Ø¬Ø²Ø¦Û Ø§Ø¹Ù Ø§ÙâØ´Ø¯Ù ÛØ§ Ø¬Ø²Ø¦Û Ù ÛâÙØ§Ù ÙØ¯.
تابعâÙØ§Û Ø¬Ø²Ø¦Û Ø²Ù
اÙÛ Ú©Ù Ù
ا ÙÙ
ÛâØ®ÙØ§ÙÛÙ
آرگÙÙ
ا٠ÛکساÙÛ Ø±Ø§ ÙØ± بار تکرار Ú©ÙÛÙ
Ù
ÙØ§Ø³Ø¨ ÙØ³ØªÙد. Ù
Ø«ÙØ§ زÙ
اÙÛ Ú©Ù Ù
ا تابع send(from, to) را دارÛÙ
Ù from ÙÙ
ÛØ´Ù Ø¨Ø§ÛØ¯ Ø¨Ø±Ø§Û Ú©Ø§Ø± Ù
ا ÛÚ©Ø³Ø§Ù Ø¨Ø§Ø´Ø¯Ø Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
از آ٠تابع Ø¬Ø²Ø¦Û Ø¨Ø³Ø§Ø²ÛÙ
٠از اÛ٠تابع Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)