همانطور که میدانیم جاوااسکریپت یکی از منعطفترین ابزارها برای طراحی وب است. اما با این وجود سوالات و شُبَهات بسیاری در مورد این ابزار وجود دارد.
در این مطلب قصد داریم که شما را با ۱۲ سوال مرسوم و متداول که مربوط به جاوااسکریپت است آشنا کنیم. اینها سوالاتی هستند که نه فقط افراد عادی بلکه افراد متخصص نیز ممکن است به روشنی جوابشان را ندانند. همراه با سوالات جوابهایشان نیز ارائه میگردد، برخی از این سوالات را در مصاحبههای شغلی نیز میپرسند.
۶. منظور از use strict در بالای یک بلاک کد چیست؟
ES5 یک خاصیت اختیاری را در جاوااسکریپت ایجاد کرد که strict mode نام دارد. در حالت strict یا سخت گیرانه شما با خطاهای بسیاری مواجه خواهید شد و هدف ساخت کدهای بدون نقص و اشتباه است تا صرفا دریافت نتیجه!
function strictFunction() {
'use strict';
myVar = 4; //ReferenceError
}
در بالا ما قصد داریم به متغیری دسترسی داشته باشیم که در حقیقت وجود ندارد. در خارج از strict mode بایستی یک متغیر در سطح global را ایجاد کنیم در غیر اینصورت تابع به کلی اشتباه عمل خواهد کرد. ماژول های ES2015 به صورت پیشفرض در حالت strict mode قرار دارند اما با در نظر گرفتن حالت closures میشود از use strict همزمان برای یک تابع و یا برای کلیت یک فایل استفاده کرد.
۷. معنای عبارت hoisting چیست؟
جاوااسکریپت الزاما قبل از توزیع شدن نیازی به کامپایل کردن ندارد، این موضوع منحصر به فردی است. مرورگر اسکریپتها را کامپایل میکند و به توابع و متغیرهایی که در آن پیادهسازی شدهاند نگاه میکند.
بعد از آن مرورگر یک گذر دیگر برای اجرای کدها میزند. در این گذر مکانی که توابع و متغیرها اعمال میشوند را کشف میکند. وقتی که یک بلاک کد اجرا میشود، تابع و متغیرهای تعریف شده در بالای بلاک hoisted –برافراشته- میشوند.
welcome("Matt"); //"Welcome, Matt."
function welcome(name) {
return `Welcome, ${name}.`;
}
در این مثال، ما قادر به استفاده از تابع welcome در بالای اسکریپت فراخوانی شده هستیم.
۸. تفاوت بین توابع arrow و توابع عادی چیست؟
ES2015 تغییرات بسیاری به خود دید و یکی از این تغییرات قابلیت توابع arrow بود.
function CountUp() {
this.x = 0;
setInterval(() => console.log(++this.x), 1000); }
var a = new CountUp();
تفاوت بین توابع arrow و حالت عادی فارغ از اینکه نوشتن این تابع به نسبت حالت قبلی کوتاه تر است، این است که توابع arrow مقادیر خودشان را برای this ایجاد نمیکنند. بجای آن از مقدار مربوط به بلاک enclosing بهره میگیرند. در مثال بالا این مقدار ۱،۲،۳ و... خواهد بود. در حالت عادی this.x تعریف نشده است و مقدار NaN را برای ما برمیگرداند. استفاده از این توابع برای حالت promise بسیار مفید است.
۹. چه زمانی باید از کلمه کلیدی let و const بجای var استفاده کنم؟
یکی دیگر از تغییرات اساسی در ES2015 معرفی let و const به عنوان یک راه جایگزین برای تعریف متغیرها بوده است. متغیرهایی که در این شیوه تعریف میشوند محدود به آن بلاکی خواهند بود که در آن تعریف شدهاند. این حالت باعث میشود که بتوانیم با دقت بیشتری متغیرهای مورد نظرمان را ایجاد کنیم.
for(let x=1; x<=3; x++) {
console.log(x); // 1, 2, 3}
console.log(x); // "x is not defined"
اگر مقدار یک متغیر قرار نیست که تغییر کند، از const استفاده کنید. وقتی که بخواهید مقدار جدیدی را به این نوع از متغیرها بدهید با خطا همراه خواهید بود. شیها و متغیرهای مربوط به آرایهها هنوز میتوانند به صورت داخلی تغییر کنند اما به صورت کامل جایگزین نخواهند شد.
Let و const مانند var قابلیت hoisted نمیشود، بنابراین نمیتوان آنها را قبل تعریف شدن فراخوانی کنید. بین شروع بلاک و مقدار دهی یک فاصله وجود دارد که با عنوان 'temporal dead zone' شناخته میشوند. این قسمت برخی اوقات ممکن است باعث سردرگمی شود.
۱۰. برنامهنویسی تابعی چیست و تفاوتهای آن کدام است؟
برنامهنویسی تابعی راهی دیگر برای طراحی و ساخت اپلیکیشنها است. در این شیوه تمام اپلیکیشن و پردازشها از طریق توابع انجام میشود. با در نظر نگرفتن مشکلاتی که برنامهنویسی تابعی به همراه دارد، باید بگوییم که درک کدهای نوشته شده در این حالت بسیار آسان است.
به صورت سنتی پروژه هایی که با استفاده از جاوااسکریپت نوشته شده بودند از ساختار شئگرا استفاده میکردند. اطلاعات مربوط برنامه در یکسری از شئها ذخیره میشد.
اما برنامهنویسی تابعی راه کاملا جدیدی برای فکر کردن را ارائه داد. درحالیکه زبانهایی مانند F# به صورت کامل مبتنی بر این روش برنامهنویسی هستند، جاوااسکریپت در نسخه جدید خود نیز متدها و گزینههایی را ارائه داده که برای ایجاد چنین پروژههایی کمک میکند.
تمام کارها در این حالت به صورت خالص و کامل از طریق یکسری تابع انجام میشد. اینها توابعی هستند که روی دادههای خارج از خود –در توابع دیگر- تاثیری نمیگذارند. به صورت سادهتر باید بگوییم که اگر یک مقدار وارد یک تابع میشود همان خروجی نیز همواره دریافت میشود.
این بدان معناست که هیچ وضعیتی بین توابع به اشتراک گذاشته نمیشود. هر وضعیتی که در اپلیکیشن نیاز به استفاده شدن دارد باید از طریق پارامترها وارد شود.
در نهایت کدها باید از تغییر دادن مقادیر بعد از ایجاد خودداری کنند. برای مثال هر تغییری که در یک شئ اتفاق میافتد همراه با یک کپی از همان شئ همراه با مقادیر تغییر داده شده برگشت داده میشود. این کار باعث میشود که تاثیرات جانبی روی کدها که گاهی باعث ایجاد باگ و مشکلات میشود ایجاد نشود.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید