تابع در جاوا اسکریپت — آموزش Function به زبان ساده + مثال

۴۲۹۹ بازدید
آخرین به‌روزرسانی: ۰۸ شهریور ۱۴۰۲
زمان مطالعه: ۱۳ دقیقه
تابع در جاوا اسکریپت — آموزش Function به زبان ساده + مثال

«تابع» (Functions) یکی از مفاهیم اساسی در برنامه نویسی است. توابع به برنامه‌نویسان اجازه می‌دهند کدهای مختصر، استاندارد، قابل استفاده مجدد و قابل نگهداری بنویسند. جاوا اسکریپت عملکردهایی شبیه به اکثر زبان‌های برنامه نویسی ارائه می‌دهد. در جاوا اسکریپت، تابع به کاربر این امکان را می‌دهد تا یک بلوک از کدها را تعریف کند، به آن نامی نسبت بدهد و سپس آن را هر چند باری که می‌خواهد در قسمت‌های مختلف برنامه اجرا کند. استفاده از توابع در جاوا اسکریپت می‌تواند فرایند کدنویسی را بسیار مختصرتر و آسان‌تر کند. در این مطلب آموزشی از مجله فرادرس، تابع در جاوا اسکریپت و انواع آن به همراه مثال‌های جذاب و متعدد مورد بررسی قرار گرفته‌اند.

تابع در جاوا اسکریپت چیست؟

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

  1. اعلان یا تعریف تابع (Function Declaration)
  2. عبارت تابعی (Function Expression)

نام گذاری توابع در جاوا اسکریپت

توابع در جاوا اسکریپت به صورت کُنش هستند و بنابراین نام آن‌ها معمولاً فعل است. نام تابع معمولاً باید مختصر و تا حد امکان دقیق باشد و آنچه را توصیف کند که تابع انجام می‌دهد تا کسی که کد را تحلیل می‌کند یا آن را می‌خواند بتواند به آسانی آن را درک کند.

مفهوم تابع در جاوا اسکریپت

برای مثال، توابعی که با show  شروع می‌شوند معمولاً چیزی را نشان می‌دهند. یا مثلاً نمادهای خاص، همگی بیانگر عمل مشخصی هستند که در زیر تعدادی از آن‌ها به عنوان نمونه آورده شده است.

  • Get...  : برگرداندن مقداری
  • Calc...  : محاسبه کردن مقداری
  • Create...  : ساختن چیزی
  • Check...  : بررسی کردن چیزی، برگرداندن مقدار Boolean و غیره

مثالی از نام‌گذاری Function در جاوا اسکریپت به صورت زیر است:

1showMessage(..)     // shows a message
2getAge(..)          // returns the age (gets it somehow)
3calcSum(..)         // calculates a sum and returns the result
4createForm(..)      // creates a form (and usually returns it)
5checkPermission(..) // checks a permission, returns true/false

با وجود پیشوندها، نگاهی اجمالی به نام تابع به کسی که کد را تحلیل می‌کند این درک را می‌دهد که تابع نام برده شده چه نوع کاری انجام خواهد داد و چه نوع ارزشی را بازمی‌گرداند.

پارامتر های تابع در جاوا اسکریپت

فانکشن در جاوا اسکریپت می‌تواند یک یا چند پارامتر یا آرگومان داشته باشد که به وسیله کد فراخوانی ارجاع داده می‌شود و از این آرگومان‌ها در داخل تابع برای اجرای عملیات استفاده خواهد شد. جاوا اسکریپت زبانی با تعیین نوع پویا است، بنابراین پارامتر تابع می‌تواند مقداری از هر نوع داده‌ای داشته باشد.

مثالی برای درک بهتر مفهوم پارامتر تابع در جاوا اسکریپت

مثال زیر تصویر بهتری نسبت به مفهوم تابع در جاوا اسکریپت ارائه می‌دهد.

1function ShowMessage(firstName, lastName) {
2    alert("Salam" + firstName + " " + lastName);
3}
4
5ShowMessage("Ali", "Amini");
6ShowMessage("Ahmad", "Rasoli");
7ShowMessage(100, 200);

خروجی به صورت زیر است:

Salam Ali Amini 
Salam Ahmad Rasoli 
Salam 100 200

هنگام فراخوانی تابع، می‌توان آرگومان‌های کمتر یا بیشتری را ارسال کرد. اگر آرگومان‌های کمتری ارسال شوند، بقیه پارامترها تعریف نشده خواهند بود. اگر آرگومان‌های بیشتری ارسال شوند، آرگومان‌های اضافی نادیده گرفته می‌شوند. مثال زیر این موضوع را بیان می‌کند.

1function ShowMessage(firstName, lastName) {
2    alert("Hello " + firstName + " " + lastName);
3}
4
5ShowMessage("Ali", "Amini", "Mr."); // display Hello Ali Amini
6ShowMessage("Ahmad"); // display Hello Ahmad undefined
7ShowMessage(); // display Hello undefined undefined

تعریف یا اعلان تابع در جاوا اسکریپت چگونه است؟

تابع جاوا اسکریپت را می‌توان با استفاده از کلمه کلیدی Function تعریف یا اعلان کرد و سپس نام تابع با یک فاصله در مقابل آن نوشته می‌شود. سپس علامت‌های پرانتز باز و بسته در مقابل نام تابع قرار می‌گیرد و در صورت نیاز، پارامترهای دریافتی هم داخل این پرانتز مشخص می‌شوند.

سینتکس اعلان تابع در جاوا اسکریپت به صورت زیر است:

1//defining a function
2function <function-name>()
3{
4    // code to be executed
5};
6
7//calling a function
8<function-name>();

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

  • کلمه کلیدی Function
  • نام تابع
  • پرانتز «می‌تواند پارامترها را بگیرد یا خالی باشد»
  • بدنه تابع

مثال اعلان تابع در جاوا اسکریپت

مثالی از اعلان تابع در جاوا اسکریپت در ادامه آمده است.

1function ShowMessage() {
2    alert("Salam Faradars!");
3}
4
5ShowMessage();

خروجی این تابع به صورت زیر است:

Salam Faradars

متغیر محلی فانکشن در جاوا اسکریپت چیست؟

«متغیر محلی» (Local Varible) در توابع جاوا اسکریپت، متغیری تعریف شده در داخل تابع است که فقط در داخل آن تابع قابل‌ مشاهده و دسترسی خواهد بود. در مثال زیر message یک متغیر محلی محسوب می‌شود و استفاده از آن در خارج تابع منجر به بروز خطا شده است.

1function showMessage() {
2  let message = "Salam,Faradars!"; // local variable
3
4  alert( message );
5}
6
7showMessage(); // salam, faradars!
8
9alert( message ); // <-- Error! The variable is local to the function

متغیرهای سراسری تابع در جاوا اسکریپت

Function در جاوا اسکریپت می‌تواند به «متغیر سراسری» (Global Variable) نیز دسترسی داشته باشد. از این متغیرها به عنوان متغیرهای جهانی نیز یاد می‌شود. مثال زیر در رابطه با این موضوع است.

1let userName = 'Faradars';
2
3function showMessage() {
4  let message = 'salam, ' + userName;
5  alert(message);
6}
7
8showMessage(); // salam, Faradrs

تابع می‌تواند به متغیر سراسری دسترسی کامل داشته باشد و حتی می‌تواند آن را اصلاح هم بکند. این موضوع در قطعه کد زیر نشان داده شده است.

1let userName = 'Faradars'
2
3function showMessage() {
4  userName = "Faradars.blog"; // (1) changed the outer variable
5
6  let message = 'Salam, ' + userName;
7  alert(message);
8}
9
10alert( userName ); // Faradars before the function call
11
12showMessage();
13
14alert( userName ); // Faradars.blog, the value was modified by the function

در توابع جاوا اسکریپت متغیر سراسری تنها در صورتی استفاده می‌شود که متغیر محلی وجود نداشته باشد. اگر متغیری با همان نام در داخل تابع تعریف شود، متغیر سراسری نادیده گرفته می‌شود. به عنوان مثال، در کد زیر تابع از نام کاربری محلی استفاده می‌کند و متغیر سراسری نادیده گرفته خواهد شد:

1let userName = 'Faradars';
2
3function showMessage() {
4  let userName = "Faradars.blog"; // declare a local variable
5
6  let message = 'Salam, ' + userName; // Faradars.blog
7  alert(message);
8}
9
10// the function will create and use its own userName
11showMessage();
12
13alert( userName ); // Faradars, unchanged, the function did not access the outer variable

متغیر سراسری چیست؟

متغیرهای تعریف شده خارج از هر تابع جاوا اسکریپت، مانند نام کاربری خارجی در کد بالا، سراسری نامیده می‌شوند. متغیرهای سراسری در هر تابعی قابل‌ دسترسی هستند، مگر اینکه متغیر محلی مانند مثال بالا باعث نادیده گرفتن آن‌ها شود.

ویژگی های Function در جاوا اسکریپت

توابع در جاوا اسکریپت باید کوتاه باشند و دقیقاً یک کار را انجام دهند. برخی مواقع شاید ارزش آن را داشته باشد که تابع را به چند تابع کوچک‌تر تقسیم کنیم، اما همیشه پیروی از این قانون چندان آسان نیست و شاید اصلاً امکان‌پذیر نباشد. تقسیم توابع به توابع جداگانه،  آزمایش و اشکال‌زدایی را آسان‌تر می‌کند. برای مثال، تابع showPrimes(n) در ادامه به دو روش مختلف نوشته شده و با هم مقایسه شده‌اند. هر کدام اعداد اول را تا n در خروجی نشان می‌دهند. اولین نوع از این تابع در جاوا اسکریپت از برچسب برای این هدف استفاده می‌کند.

1function showPrimes(n) {
2  nextPrime: for (let i = 2; i < n; i++) {
3
4    for (let j = 2; j < i; j++) {
5      if (i % j == 0) continue nextPrime;
6    }
7
8    alert( i ); // a prime
9  }
10}

نوع دوم، از تابع اضافی دیگری به نام isPrime(n)  برای آزمایش اول بودن یا نبودن استفاده می‌کند.

1function showPrimes(n) {
2
3  for (let i = 2; i < n; i++) {
4    if (!isPrime(i)) continue;
5
6    alert(i);  // a prime
7  }
8}
9
10function isPrime(n) {
11  for (let i = 2; i < n; i++) {
12    if ( n % i == 0) return false;
13  }
14  return true;
15}

درک قطعه کد نوع دوم آسان‌تر است و افراد بیشتری از این سبک استفاده می‌کنند. این شیوه کد نویسی برای توابع، کد را ساختار می‌دهد و آن را خواناتر می‌کند.

شیء آرگومان در جاوا اسکریپت

همه توابع در جاوا اسکریپت می‌توانند به طور پیش‌فرض از «شیء آرگومان» (Arguments Object) استفاده کنند. شیء آرگومان شامل مقدار هر پارامتر است. شیء آرگومان‌ها یک شی شبیه آرایه هستند. با استفاده از شاخصی مشابه آرایه می‌توان به مقادیر آن دسترسی پیدا کرد. با این حال، شیء آرگومان در جاوا اسکریپت از روش‌های آرایه پشتیبانی نمی‌کند. می‌توان با استفاده از شیء آرگومان‌های تابع، در داخل آن تابع به آرگومان‌های آن مراجعه کرد.

1function ShowMessage(firstName, lastName) {
2    alert("Salam " + arguments[0] + " " + arguments[1]);
3}
4
5ShowMessage("Ali", "Amini"); 
6
7ShowMessage("Ahmad", "Rasoli");
8
9ShowMessage(100, 200);

شیء آرگومان، حتی اگر تابع هیچ پارامتری را شامل نشود بازهم معتبر است. مثال زیر این موضوع را بیان می‌کند.

1function ShowMessage() {
2    alert("Salam " + arguments[0] + " " + arguments[1]);
3}
4
5ShowMessage("Ali", "Amini"); // display Salam Ali Amini

شیء آرگومان را می‌توان با استفاده از حلقه For در جاوا اسکریپت پیمایش کرد. در مثال زیر این موضوع نشان داده شده است.

1function ShowMessage() {
2
3    for(var i = 0; i < arguments.length; i++){
4        alert(arguments[i]);
5    }
6}
7
8ShowMessage("Ali", "Amini"); 

به صورت کلی در مورد آرگومان و نقش آن در Functions در جاوا اسکریپت می‌توان گفت که اگر تعداد آرگومان‌ها بیشتر از تعداد تعریف شده باشند، می‌توان با استفاده از شیء آرگومان در جاوا اسکریپت به آن‌ها دسترسی پیدا کرد.

مقادیر بازگشتی در توابع جاوا اسکریپت

در تابع می‌توان با استفاده از کلمه کلیدی return  ، مقداری را بازگرداند. مثال زیر در این رابطه است.

1function Sum(val1, val2) {
2    return val1 + val2;
3};
4
5var result = Sum(10,20); // returns 30
6
7function Multiply(val1, val2) {
8    console.log( val1 * val2);
9};
10
11result = Multiply(10,20); // undefined

در مثال بالا، تابعی به نام Sum  ، دو متغیر val1   و val2  را با هم جمع می‌کند و نتیجه را بازمی‌گرداند. بنابراین، کد فراخوانی شده می‌تواند مقدار بازگشتی را دریافت کرده و آن را به متغیری اختصاص دهد. تابع دوم Multiply  هیچ مقداری را بر نمی‌گرداند، بنابراین نتیجه تعریف نشده را بازمی‌گرداند. تابع می‌تواند تابع دیگری را در جاوا اسکریپت برگرداند. در مثال زیر این موضوع نشان داده شده است.

1function multiple(x) {
2
3    function fn(y)
4    {
5        return x * y;
6    }
7    
8    return fn;
9}
10
11var triple = multiple(3);
12triple(2); // returns 6
13triple(3); // returns 9

همان‌طور که گفته شد، برای ایجاد تابعی که پس از فراخوانی تابع به یک مقدار تبدیل شود، از کلمه کلیدی Return  استفاده می‌شود. این کلمه در بدنه تابع نوشته می‌شود. Return دستوری است که پس از اجرای کد داخل تابع، مقداری را به ازای آن تابع برمی‌گرداند. استفاده از Return در داخل تابع، دستکاری داده‌هایی را که تابع برمی‌گرداند و انجام عملیات اضافی دیگر را روی آن، آسان می‌کند.

عبارت تابعی در جاوا اسکریپت

جاوا اسکریپت به کاربر این امکان را می‌دهد تا تابعی را به متغیری اختصاص دهد و سپس از آن متغیر در جاوا اسکریپت به عنوان تابع استفاده کند. به این عمل، ساخت «عبارت تابعی» (Function Expression) می‌گویند. عبارت تابع روش دیگری برای ابراز و استفاده از تابع در جاوا اسکریپت است.

این روش از نظر سینتکسی، شباهت یادی به اعلان تابع دارد، اما عبارت تابعی به کاربر این امکان را می‌دهد که تابع را با نام تعریف کند یا نام تابع را حذف کند که در این صورت به آن تابع ناشناش گفته می‌شود. سینتکس عبارت تابعی در جاوا اسکریپت به صورت زیر است.

1let namedFunction = function myFunction(){
2	//some code here...
3}

در این مثال، تابع دارای نام myFunction  است و در آن، تابع دارای نام بوده و به هیچ وجه ناشناس نیست. هنگام تعریف یک تابع ناشناس، نام تابع حذف می‌شود. مثالی از ابراز تابع به شکل عبارت در جاوا اسکریپت به صورت زیر است:

1var add = function sum(val1, val2) {
2    return val1 + val2;
3};
4
5var result1 = add(10,20);
6var result2 = sum(10,20); // not valid

تفاوت عمده بین تعریف تابع و عبارت تابعی این است که در عبارت تابعی، می‌توان تابع را حتی قبل از تعریف آن هم فراخوانی کرد. این عمل در مورد حالت معمولی تعریف تابع در جاوا اسکریپت امکان‌پذیر نیست.

تابع ناشناس در جاوا اسکریپت

جاوا اسکریپت به کاربر اجازه می‌دهد تا تابع را بدون هیچ نامی تعریف کند. این تابع بدون نام، «تابع ناشناس» (Anonymous Function) نامیده می‌شود. وقتی تابع ناشناس تعریف می‌کنیم، درست مثل مثال زیر، نام تابع حذف می‌شود:

1let anonymousFunction = function(){
2	//some code here...
3}

ملاحظه می‌شود که تابع فوق به یک متغیر اختصاص داده شده‌ است. کلمه کلیدی Function  یک «مقدار تابعی» (Function Value) ایجاد می‌کند که وقتی به عنوان «عبارت» (Expression) به کار می‌رود، می‌توان آن را به متغیری نسبت داد. بنابراین، برای فراخوانی این تابع، از نام متغیر استفاده می‌شود. نام متغیر در واقع به‌ عنوان نام جدید تابع عمل می‌کند.

تابع ناشناس در جاوا اسکریپت

کاربرد تابع ناشناس در جاوا اسکریپت چیست؟

تابع ناشناس در جاوا اسکریپت در موارد زیر کاربرد دارد:

  • ارجاع تابع Callback
  • ایجاد «بستار» (Closure)
  • «عبارت تابعی بلافاصله فراخوانی شده» (Immediately Invoked Function Expressions | IIFE)

مثالی برای تابع ناشناس در جاوا اسکریپت

در ادامه، مثالی برای درک بهتر تابع ناشناس در جاوا اسکریپت ارائه شده است.

1var showMessage = function (){
2    alert("Salam!");
3};
4
5showMessage();
6
7var sayHello = function (firstName) {
8    alert("Salam " + firstName);
9};
10
11showMessage();
12
13sayHello("Faradars");

خروجی به صورت زیر است:

Salam Faradars

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

«توابع فوری فراخوانی شده» (Immediately Invoked Function Expressions) که به اختصار IIFE خطاب می‌شود، یکی دیگر از نمادگان عبارت‌های تابعی در جاوا اسکریپت (تابع ناشناس) است که به صورت مجزا کار می‌کند و مستقل از هر کد دیگری است. این تابع در جاوا اسکریپت بلافاصله در جایی که تعریف شده است، فراخوانی می‌شود. سینتکس آن به صورت زیر است:

1(function (){
2	//function body
3})();

یکی از موارد استفاده از IIFE این است که متغیری را در بر بگیرد که احتمالاً دوباره در داخل کدها استفاده نشود. بنابراین به محض اجرای تابع، متغیر موجودیت پیدا خواهد کرد.

توابع تو در تو در جاوا اسکریپت

در جاوا اسکریپت، تابع می‌تواند یک یا چند تابع درونی داشته باشد که به آن‌ها «توابع تودرتو» (Nested Functions) می‌گویند. تابع داخلی می‌تواند به متغیرها و پارامترهای تابع بیرونی دسترسی داشته باشد. با این حال، تابع بیرونی نمی‌تواند به متغیرهای تعریف شده در داخل توابع داخلی دسترسی پیدا کند.

برای درک بهتر توابع تو‌درتوی جاوا اسکریپت در ادامه مثالی ارائه شده است.

1function ShowMessage(firstName)
2{
3    function SayHello() {
4        alert("Salam" + firstName);
5    }
6
7    return SayHello();
8}
9
10ShowMessage("Faradars");

خروجی در ادامه آمده است.

Salam Faradars

توابع پیکان در جاوا اسکریپت

«توابع پیکان» (Arrow Function) در جاوا اسکریپت نماد دیگری از عبارت تابعی هستند، اما سینتکس کوتاه‌تری دارند. آن‌ها اولین بار در ES6 معرفی شدند و به کاربر در نوشتن کدهای تمیزتر کمک می‌کنند.

توابع پیکان در javascript

در توابع پیکان، کلمه کلیدی تابع حذف شده می‌شود و به جای آن از علامت پیکان (=>)   استفاده خواهد شد. سینتکس آن به صورت زیر است:

1let nameOfFunction = (parameters) => {
2	//function body
3}
4

عملکرد محدوده تابع و بستارها در جاوا اسکریپت چگونه است؟

«محدوده» (Scope) مربوط به مباحث «دسترس‌پذیری» (Accessibility) در جاوا اسکریپت است. هر تابع جدیدی که تعریف می‌شود، محدوده‌ای جدید ایجاد می‌کند که به نام «محدوده تابع» (Function Scope) شناخته می‌شود. متغیرهای ایجاد شده در محدوده تابع، خارج از آن محدوده قابل ‌مشاهده یا قابل دسترسی نیستند.

عملکرد محدوده و بسته شدن در جاوا اسکریپت

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

همچنین، فرضاً تابع فرزند (یعنی تابعی داخلی) به صورت تو در تو درون تابع والد (که تابع بیرونی است) قرار می‌گیرد. تابع فرزند می‌تواند به همه متغیرها و توابع اعلام شده در تابع والد خود و همچنین به همه متغیرها و توابعی دسترسی داشته باشد که تابع والد به آن‌ها دسترسی دارد؛ حتی زمانی که اجرای تابع والد به پایان رسیده است و متغیرهای آن دیگر در خارج از آن تابع قابل دسترسی نیستند.

این مفهوم در جاوا اسکریپت به‌عنوان «بستار» (Closure) شناخته می‌شود. با این حال، تابع والد نمی‌تواند به متغیرهای ایجاد شده در تابع فرزند دسترسی داشته باشد. به این ترتیب، متغیرها و توابع داخل تابع فرزند به دامنه خود محدود می‌شوند.

مثال هایی برای درک بهتر Scope و Closure در توابع جاوا اسکریپت

در ادامه مثال‌هایی برای بررسی عملکرد محدوده و بستار در جاوا اسکریپت آمده است. ابتدا برای Scope مثال زیر ارائه می‌شود.

1//variables defined in the global scope
2
3let  a = 40;
4let b = 20;
5
6//this function is also defined in the global scope
7
8function parentFunc(){
9	//access variables a and b inside this function
10
11	console.log(a + b); 
12}

خروجی به صورت زیر است:

60

همچنین برای نمونه در مثال زیر تابع فرزند در داخل تابع والد تعریف شده است.

1//variables defined in the global scope
2
3let a = 40;
4let b = 20;
5
6//this function is also defined in the global scope
7
8function parentFunc(){
9	let  name = “Doe”;
10    
11    //this inner function is defined inside the parent function scope
12    
13	function childFunc(){
14		console.log(`${name} is ${a - b} years old`); 
15      }
16    return childFunc();
17}
18
19parentFunc(); //ouput: Doe is 20 years old

حال اگر متغیری در داخل تابعی ایجاد شود و کاربر سعی کند از دامنه سراسری به آن دسترسی داشته باشد، با «خطای مرجع» (ReferenceError) مواجه خواهد شد. این به این دلیل است که آن متغیر در محدوده تابع محلی تعریف شده است و برای دامنه سراسری یا Global قابل ‌مشاهده نیست.

1console.log(c);
2
3function parentFunc(){
4	let c = 30
5} 
6
7//output: reference error - c is not define

در مثال زیر سعی شده است به متغیر ایجاد شده در یک تابع تودرتو در تابع والد دسترسی ایجاد شود.

1function parentFunc(){
2	console.log(age);
3	function childFunc(){
4		let  age = 20;
5	} 
6    return childFunc();
7}
8
9parentFunc(); 

خروجی به صورت زیر است.

1function greeting(name, message = ”Salam”){
2	console. log(`${messgae}  ${name}`)
3}
4
5greeting(‘Faradars’); //output:Salam Faradars
6//you can also assign a new value to the default parameter 
7//when you call the function
8greeting(‘Doe’, ‘Hi’); //output: Salam Doe

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
javascript.infotutorialsteacherfreecodecamp
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *