40 - جاواسکریپت: Framework, Function Overloading

میخواهیم ببینیم آنچه تا به حال گفته شد چگونه در framework ها یا کتابخانه های رایج به کار گرفته شده اند.یک چیزی که در js نداریم ولی خیلی از زبان های برنامه نویسی دارند function overloading است. در زبان های برنامه نویسی دیگر مثل c# و جاوا میتوانیم تابع هایی با یک اسم و با تعداد مختلف پارامتر داشته باشیم. ولی در js چنین چیزی نداریم چون در js تابع ها شیء هستند و چنین چیزی در دسترس نیست. اما مشکلی نیست چون با داشتن first class function آپشن های خیلی بیشتری داریم. اگر بخواهیم جایگزین هایی برای نحوه فراخوانی متد greet داشته باشیم، برای مثال نخواهیم همیشه پارامتر language را پاس دهیم:function greet(firstname, lastname, language) { ... }همان طور که قبلا گفته شد میتوانیم برای language مقدار پیش فرض تعیین کنیم و با منطق داخل تابع برای مقادیر مختلف language تصمیم گیری کنیم. مثلا:function greet(firstname, lastname, language) {language = language || 'en';if (language === 'en') { console.log('Hello '+fristname+' '+lastname); }if (language === 'es') { console.log('Hola '+fristname+' '+lastname); }}greet('John', 'Doe', 'en');greet('John', 'Doe', 'es');اما ممکن است نسخه دیگری از این تابع را بخواهیم که در آن لازم نباشد اطلاعات زیادی به تابع پاس دهیم. میتوانیم با ایجاد یک تابع دیگر این کار را انجام دهیم. در این تابع مقادیر پیش فرض مشخص به تابع greet پاس داده میشوند. مثلا: function greetEnglish(lastname, firstname){ greet(firstname, lastname, 'en'); } function greetSpanish(lastname, firstname){ greet(firstname, lastname, 'es'); }greetEnglish('John', 'Doe');greetSpanish('John', 'Doe'); به جای پاس دادن پارامتر از تابعی که مقدار پیش فرض رو پاس داده استفاده کردیم. تابع های greetEnglish و greetSpanish هر دو تابع greet را فراخوانی میکنند ولی به صورت پیش فرض یک پارامتر مشخص را پاس میدهند. این یک روش برای داشتن فراخوانی های ساده تر تابع ها است. نیازی به نگرانی در مورد نداشتن امکان function overloading در js نیست چون الگوهای دیگه و حتی بهتری در js وجود دارد. یکی از این الگوها روش بالا بود. این روش در framework ها زیاد استفاده میشود تا استفاده از framework یا کتابخانه را راحتتر کند و مشخص باشد که تابع دارد چه کار میکند.41 - جاوااسکریپت: Syntax Parserکدی که مینویسیم به طور مستقیم در کامپیوتر اجرا نمیشود. بلکه یک برنامه واسطه بین کد ما و کامپیوتر وجود دارد که کد را ترجمه میکند به چیزی که کامپیوتر بتواند بفهمد. موتور js روی بروزر هم این کار را میکند. برای این کار از مفاهیم و المنت های مختلفی استفاده میکند که یکی از آنها syntax parser است که کد ما را میخواند و تشخیص میدهد آیا معتبر است یا نه و میخواهد چه کار انجام دهد. بنابراین اگر بعد از خواندن کاراکتر به کاراکتر از کد ما به حرف r برسد، فرض میکند که احتمالا میخواهیم return بنویسیم و منتظر e است. اگر چیزی ببیند که در انتظارش نباشد خطا میدهد. ولی اگر چیزی ببیند که از نظر سینتکسی معتبر باشد به خواندن کد ادامه میدهد و میداند میخواهیم چه کار کنیم. تا زمانی که به ; برسد.بنابراین تصور کنید که syntax parser که قسمتی از موتور js است کد ما را کاراکتر به کاراکتر میخواند و فرضهایی را بر اساس قوانینش ایجاد میکند و حتی ممکن است قبل از اجرای کد، تغییراتی در کد ما ایجاد کند. پس موتور js کد ما را کاراکتر به کاراکتر میخواند و از مجموعه ای از قوانین استفاده میکند تا سینتکس معتبر را تشخیص دهد و تصمیم بگیرد که ما میخواهیم چه کار کنیم. همه اینها قبل از اجرای کد انجام میشود.42 - جاوااسکریپت: Automatic Semicolon Insertionهیچ زبان برنامه نویسی کامل و بی نقص نیست. الان میخواهیم در مورد خطری صحبت کنیم که خیلی ساده ممکن است پیش بیاید و پیدا کردن آن ممکن است خیلی سخت باشد. این خطر در مورد syntax parser در js است: اضافه کردن ; به صورت خودکار. syntax parser در js با هدف مفید بودن این کار را انجام میدهد. در هسته js استفاده از ; اختیاری است. چون موتور js در هر زمان یک کاراکتر را در statement میبیند و میداند که زبان در انتظار چی هست، یعنی میداند که سینتکس باید چه شکلی باشد. پس اگر ببیند که داریم یک خط را تمام میکنیم یعنی enter زده ایم (return و بعد enter)، میگوید در این statement خاص مجاز به رفتن به خط بعد نیستی پس خودم به طور خودکار یک ; میگذارم (return;). بنابراین هر جایی که syntax parser منتظر یک ; باشد، خودش برای ما ; میگذارد. به همین دلیل گذاشتن آن توسط ما اختیاری است.اما ما باید همیشه خودمان ; را بگذاریم. چون نمیخواهیم که موتور js برای ما تصمیم بگیرد. این مسئله در مورد کلمه کلیدی return خیلی مهم است. چون اضافه کردن ; به صورت خودکار میتواند مشکل بزرگی ایجاد کند.function getPerson() { return { firstname: 'Tony' }}console.log(getPerson());اگر این کد را اجرا کنیم خروجی undefined میدهد. چون موتور js اگر کاراکتر enter را بعد از کلمه کلیدی return ببیند، خودش به طور اتوماتیک یک ; اضافه میکند. یعنی با گذاشتن object literal syntax در خط جدید باعث شدیم که موتور js تصمیم بگیرد یک ; اضافه کند. پس این خروجی را خط بعد تایپ نمیکنیم و با یک اسپیس از return تایپ میکنیم:function getPerson() { return { firstname: 'Tony' }}console.log(getPerson());در این حالت خودش به طور خودکار ; اضافه نمیکند. پس همیشه { را در همان خط از کد، بعد از تعریف تابع، بعد از حلقه for، بعد از if statement و ... تایپ میکنیم. این کار همیشه ضروری نیست، اما همیشه این کار را میکنیم تا در مواقع ضروری به مشکلی برنخوریم. پس همیشه اگر بعد از return باید object literal برگردونده بشه، شیء در همان خط کد return شروع بشه. همچنین هر جا از کد که ; نیاز هست خودمان ; را میگذاریم. چون این مسئله در debug کردن خیلی مشکل است.43 - جاوااسکریپت: Whitespaceتعریف whitespace: کاراکترهای غیر قابل مشاهده که در کد نوشته شده فاصله ایجاد میکنند. مثل enter و اسپیس و tab. برای خوانایی بیشتر کد استفاده میشود و اجرا نمیشود. syntax parser در js در این مورد خیلی لیبرال عمل میکند. مثلا:var firstname, lastname, language;var person = { firstname: 'John', lastname: 'Doe'}console.log(person);خیلی خوب است که موقع نوشتن کد از کامنت استفاده کنیم. چون js خیلی در مورد whitespace منعطف است میتوانیم به صورت زیر در کد بالا کامنت بگذاریم:var // first name of the person firstname, // last name of the person lastname, // the language // can be 'en' or 'es' language;var person = { // the first name firstname: 'John', // the last name // (always required) lastname: 'Doe'}console.log(person);در اجرا دو کد بالا هیچ فرقی با هم ندارند. چون syntax parser از همه این whitespace ها صرف نظر میکند. وقتی source code یک کتابخانه یا framework را باز میکنیم میبینیم که از whitespace ها و کامنت ها خیلی زیاد استفاده شده است. ممکنه است مثل مثال بالا یک دفعه ببینیم که در یک خط از کد فقط یک متغیر و یک کاما ننوشته شده و قبل و بعد آن کامنتهای زیادی هست. این کامنتها به فهم راحتتر کد کمک میکند. ما هم باید تا جایی که میتوانیم در کدمان از کامنت استفاده کنیم و کد را خوانا کنیم.