حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش جاوااسکریپت تکمیلی؛ توابع و پردازش داده

ساخت کارخانه تخفیف با closure در جاوااسکریپت

closure در جاوااسکریپت و تابع‌های دارای حافظه · 0٪

✍️ کارخانه تابع یعنی تابعی که بر اساس یک تنظیم، تابع دیگری می‌سازه. این الگو وقتی خوبه که یک تنظیم را بارها با ورودی‌های مختلف استفاده می‌کنیم. به جای فرستادن نرخ تخفیف در هر بار محاسبه، یک تابع محاسبه‌گر می‌سازیم که نرخ را از محیط خودش به یاد دارد.

مثلاً فروشگاه برای یک جشنواره نرخ ثابت دارد، ولی قیمت کالاها متفاوت‌اند. سازنده نرخ را یک بار می‌گیره و تابع ساخته‌شده فقط قیمت را می‌گیره. نرخ بیست درصد به شکل 0.2 داده می‌شه؛ مبلغ نهایی برابر قیمت ضرب در 1 - rate است. ضرب قیمت در خود rate فقط مقدار تخفیف را می‌ده، نه مبلغ قابل پرداخت.

در تمرین، wrapper آرایه قیمت‌ها را دریافت می‌کنه و آرایه مبلغ‌های نهایی را برمی‌گردونه؛ تابع داخلی را مستقیماً خروجی نده. نرخ صفر یعنی بدون تخفیف و نرخ یک یعنی رایگان. خطای رایج، تغییر قیمت‌های داخل ورودی یا گرد کردن نتیجه بدون درخواست است. اینجا ورودی‌ها معتبرند، ترتیب باید حفظ بشه و محاسبه را بدون گرد کردن انجام می‌دیم.

فعالیت شما

discountedPrices(rate, prices) را بنویس. rate عدد بین 0 و 1 و prices آرایه اعداد متناهی نامنفی است. داخل تابع یک کارخانه closure برای نرخ بساز و قیمت‌های نهایی price*(1-rate) را بدون گرد کردن در آرایه تازه بده؛ (0.25,[100,40]) => [75,30]، نرخ 1 => صفرها و خالی => []. ورودی تغییر نکند. تابع کمکی آماده checkDiscountedPricesUnchanged فقط تغییر نکردن ورودی و، هرجا لازم است، تازه بودن خروجی را بررسی می‌کند؛ آن را تغییر نده.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

function discountedPrices(rate, prices) {
  // TODO: کارخانه تخفیف و تابع دارای حافظه را بساز و اعمال کن.
}
function checkDiscountedPricesUnchanged(rate, prices) {
  const before = JSON.stringify([rate, prices]);
  const result = discountedPrices(rate, prices);
  return JSON.stringify([rate, prices]) === before && result !== prices;
}