برنامه نویسی
دفعات بازدید ۵۵۳جلسه ۶ آموزش برنامه نویسی زبان js در مورد scope ها و function ها
۱
جلسه ششم برنامه نویسی با زبان js
در جلسات قبل در مورد حلقه ها و جملات شرطی صحبت کردیم. این جلسه در مورد بعضی دیگر از مفاهیم پایه ای صحبت میکنیم.
scope
یکی از این مفاهیم پایه ای scope است. Scope به معنی محدوده تعریف یک متغیر است. شما تنها در جایی می توانید از یک متغیر استفاده کنید که در آن محدوده تعریف شده باشد. در نتیجه شناخت این موضوع که متغیری که تعریف می کنید تا کجا قابل دسترس است بسیار اهمیت دارد. عدم رعایت این مورد باعث می شود خطاهایی رخ دهد که بعضا به راحتی قابل پیدا کردن نیستند.
ساده ترین نوع خطا ها شاید با پیغام هایی همراه باشد که به شما کمک کند خطا را پیدا کنید. ولی بعضی از آن ها هیچ پیغام خطایی به شما نمی دهند و نتیجه اجرای برنامه صرفا آن چه که شما تصور می کنید نیست و شما نمی دانید مشکل از کجاست. در نتیجه بهتر است به مفاهیم بنیادی برنامه نویسی از این قبیل دقت بیشتری کنید.
ما چند scope داریم. یکی global است. به این معنی که از همه جای برنامه به آن ها دسترسی داریم. یا در همه جای یک فایل حداقل . این ها متغیر هایی هستند که با var تعریف می شوند و در سطح بالای کد ها تعریف می شوند. منظور سطح بالا این است که درون سایر متود ها نیستند و در جریان اصلی کد هستند.مانند تمام مثال هایی که تا کنون با آن ها آشنا بودیم.
var globalVariable=‘hello world’
به این متغیر ها می توان از سایر متود ها و جاهای برنامه دسترسی داشته باشیم.
function
اما متغیر هایی نیز هستند که تنها از درون یک فانکشن قابل دسترسی هستند . چرا که همان جا نیز تعریف شده اند.
اما فانکشن چیست. گاهی اوقات شما نیاز دارید یک سری از کار ها را دسته بندی کنید و نامی برای آن ها تعریف کنید تا به صورت مکرر آن ها را صدا کنید. این مجموعه کار ها یک هدف اصلی دارند و با متغیر هایی که شما به آن ها می دهید اندکی تغییر می کنند و می توانند یک خروجی تولید کنند و به شما بدهند.
انواع فانکشن ها می توانند مانند انجام عملیات ریاضی یا سایر کار های باشند. برای مثال شما یک فانکشن تعریف می کنید تا چند عدد از شما بگیرد و میانگین آن ها را حساب کند. یا عددی از شما بگیرد و یک عدد تصادفی کوچکتر از آن عدد برایتان تولید کند. یا فاکتوریل یک عدد را حساب کنید و … مثال ها بی شمارند.
برای تعریف فانکشن از کلمه کلیدی function استفاده می کنیم که در ادامه ی آن نام این فانکشن آورده می شود. این همان نامی است که موقع نیاز به فراخوانی این فانکشن باید آن را صدا بزنیم. سپس یک جفت پرانتز قرار میگیرد که اگر فانکشن شما نیاز به دریافت ورودی باشد در این قسمت تعریف می کنید. در نهایت یک جفت آکولاد قرار دارد که در میان آن کد مورد نظر قرار میگرد. اگر قرار است فانکشن شما نتیجه خروجی نیز داشته باشد در اخرین خط فانکشن قبل از بسته شدن آکولاد مقدار مورد نیاز را با کلمه return باز میگردانید. به مثال زیر توجه کنید که میانگین تو عدد را محاسبه و باز میگرداند.
function average(a,b){
var result= (a+b)/2
return result
}
این نوع تعریف یک فانکشن بود حال برای استفاد از آن و صدا کردن آن تنها نام فانکشن را می نویسیم و یک جفت پرانتز جلوی آن قرار میدهیم. اگر نیاز به متغیری هم باشد مقادیر آن را به آن می دهیم. مانند مثال زیر.
average(10,20)
با این کار این فانشکن با مقادیر ۱۰ و ۲۰ صدا زده می شود و توقع داریم مقدار ۱۵ را برگرداند.
خوب اینجا فانکشن را تعریف کردیم اما هدف از تعریف آن یک مفهوم کلیدی به اسم scope بود. متغیر هایی که داخل یک فانکشن تعریف می شوند در بیرون از ان فانکشن قابل صدا زدن نیستند.
در نتیجه نمی توان بیرون از آن مورد استفاده قرار گیرند. در مثال بالا که یک فانکشن تعریف کردیم هیچ کدام از متغیر های a , b , result خارج از محدوده این فانکشن قابل استفاده نیستند.
و در صورت صدا زدند آن ها با خطا مواجه می شویم.
نوع دیگر scope به طور کلی هر گونه بلاکی است. یک بلاک تشکیل شده از یک جفت آکولاد . حالت قبلی نیز یک حالت خاص از این مورد است . چرا که فانکشن ها نیز یک جفت آکولاد دارند. اما متغیرهای ورودی فانکشن بیرون آکولاد و در پرانتز تعریف می شود. در نتیجه در یک مورد جداگانه بررسی شد.
پس هر متغیری که در یک جفت آکولاد تعریف شد فقط در همان آکولاد قابل دسترسی است. اما در اینجا یک تفاوت میان var و let وجود دارد. و آن اینکه تنها متغیر هایی که از طریق let تعریف می شوند از این قاعده پیروی می کنند.اما متغیر هایی که با var تعریف می شوند بیرون از بلاک نیز قابل دسترس هستند. چرا که var از نسخه های اولیه زبان به یادگار مانده و از قوانین جدید تر scope پیروی نمی کند.
به مثال زیر توجه کنید. در این مثال متغیر result خارج از حلقه while قابل دسترس نخواهد بود.
let counter=10
while(counter — >0)
{
let result = counter * counter
console.log(result)
}
در این مثال ساده متغیر result تنها درون آکولاد while قابل دسترس است و اگر بیرون آن صدا زده شود خطا می دهد که تعریف نشده است.
hoisting
این مفهوم در مورد scope است. قبلا اشاره کردیم که کد ها به صورت بالا به پایین و از چپ به راست اجرا می شوند. اما قبل از اجرا کد ها تغییراتی در کد های ما ایجاد می شود . یکی از این تغییرات جابجایی تعریف متغیر هاست. به این صورت که در هرجای کد اگر شما متغیری تعریف کرده باشید. در همان اسکوپ متغیر شما به اولین خط اسکوپ جابجا می شود تا شما به آن دسترسی داشته باشید. به مثال زیر توجه کنید.
console.log(undefinedVariable)
در این مثال ما از یک متغیری استفاده کردیم که تعریف نشده است . اجرای این خط کد به شما خطا می دهد که این متغیر تعریف نشده است. حال به مثال زیر توجه کنید.
console.log(undefinedVariable)
var undefinedVariable=4
این بار اگر این خط ها را اجرا کنیم به ما خطا نمیدهد اگر چه می گوید که این متغیر مقدار تعریف شده ای ندارد. اما برنامه اجرا می شود. در حالت قبلی برنامه متوقف می شود و تا انتها اجرا نمی شود. حالا به مثال دیگر توجه کنید.
var undefinedVariable=4
console.log(undefinedVariable)
این یک کد ساده و معمولی است که نتیجه آن هم چاپ عدد ۴ است. نکته این است که اگر کد ها از بالا به پایین اجرا می شود. چطور می شود که در مثال دو که تعریف متغیر بعد از فراخوانی و استفاده از آن بود به ما خطایی نداد . مگر از قبل می دانست که ما چه متغیر هایی میخواهیم در ادامه تعریف کنیم. پاسخ این است که از قبل نمی داند که روند اجرای برنامه چیست. تنها خطوطی از برنامه که متغیر تعریف شده اند را به صورت پس زمینه به بالا جابجا می کند تا قابل دسترس باشند. اما مقدار دهی نمی کند. یعنی به رایانه می گوید که قرار است در خطوط بعدی کد متغیری تعریف شود با این نام ولی مقدارش را فعلا نمی گویم فعلا آن را داشته باش که به خطا نخوری وقتی به آن خط رسیدیم مقدار هم به تو می دهم.
این روند در تعریف فانکشن ها نیز معتبر است. گاهی شما از فانکشنی استفاده می کنید که هنوز تعریف نشده و بعد از فراخوانی تعریف می شود. این ها کمک می کنند که کد زدن راحت تر باشد. در بعضی زبان های دیگر این قابلیت وجود ندارد و شما حتما باید قبل از استفاده از متغیر یا فانکشن آن را تعریف کنید. در غیر این صورت به شما خطا می دهد.