جاوااسکریپت: لعنت یا نعمت؟

جاوااسکریپت وب را گرفته است و به سرعت در حال نفوذ به حوزه های دیگر است در این پست به ویژگی های این زبان عجیب می پردازم:

خیلی خوب یادم هست که بعد از یک روز که حسابی روی یک پروژه با جاوااسکریپت کار کرده بودم و ویژگی های غیر منتظره و عجیب این زبان حسابی من را گیج و صد البته عصبانی کرده بود در یکی از شبکه های اجتماعی مخصوص توسعه دهنده ها به اسم devrant مطلبی پست کردم و هرچی فوحش و ناسزا که از دهنم در می آمد به جاوااسکریپت و طراحانش دادم. جدای از اینکه بسیاری از افراد درون آن شبکه اجتماعی به خاطر این پست پرمحتوا و ستیزه جویانه از من تقدیر کردند و کامنت هایی در تایید مزخرف بودن این زبان گذاشتند و پست من رو لایک کردند اما کامنت یک فرد با بقیه متفاوت بود و آن کامنت این بود:

When I hear some body says f**k this or that thing I realize that he/she actually doesn't understand that well.

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

خوب اما چرا جاوااسکریپت اینطور است؟ جواب را باید در تاریخچه عجیب این زبان جستجو کرد:

باور بکنید یا نه جاوااسکریپت حداقل ۲۱ سال سن داره. ۲۱ سال پیش جاوااسکریپت توسط براندون آیک در کمپانی Netscape به وجود آمد، هدف از ساخت جاوااسکریپت زبانی بود که بتواند در صفحات وب به کمک Designer ها بیایید و صفحات ایستای HTML را به صفحات پویا تبدیل کند. البته در ابتدای کار قرار بود نام زبان Mocha باشد و زبانی تابع محور باشد، اما ظاهرا زبان جاوا در آن زمان سر و صدای زیادی به پا کرده بود و خیلی ها این زبان را یک زبان عالی می دونستند و به طبع در اون مقطع جامعه جاوا به سرعت به سمت رشد می رفت و متاسفانه قبل از کار براندون آیک جاوا وارد دنیای وب هم شده بود (اگر یادتون باشه خیلی قدیمترها تکنولوژی های جاوا در مرورگر برای طراحی برنامه ها و رابط های کاربری استفاده می شد که به دلیل مشکلات امنیتی زیاد و قدیمی شدن الان منسوخ شده است) و چون جاوا یک زبان خیلی شئ گرا هست مدیر پروژه Mocha در وسط کار براندون آیک به این فکر افتاد که به این زبان تابع محور امکانات شئ گرایی شبیه جاوا اضافه کند و یک روز رفت توی اتاق براندون آیک و گفت:

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

و بله اینطور شد که Mocha شد جاوااسکریپت.

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

کمپانی های متفاوت همانا و style های متفاوت کد زنی همانا. اگر شما از دنیای زبان هایی مانند پایتون یا جاوا بیایید قطعا در مواجه با جاوااسکریپت دچار سکته ناقص می شوید؛ چرا؟ مثلا زبان پایتون را در نظر بگیرید استایل کد زنی در پایتون بسیار دقیق توسط یکسری افراد میانسال و پیر که خودشون توسعه دهنده های این زبان بودند مشخص شده و شما به مراجعه به پایگاه اصلی پایتون می تونید جزوه ها و آموزش های مربوط به این زبان رو بخونید و لذت ببرید.

اما برای جاوااسکریپت هیچ پایگاه رسمی ای مثلا مثل javascript.org وجود نداره که شما بتونید از اونجا document های مربوط به این زبان رو مطالعه کنید و بنابراین style یا format خاصی برای کد زدن در جاوااسکریپت وجود ندارد تا جایی که اگر یکی از شعارهای رسمی پایتون "برای هر مسئله ای فقط یک راه وجود دارد" باشد شعار غیر رسمی جاوااسکریپت "برای هر مسئله ای بینهایت راه وجود دارد" هست.

یک مثال ساده: کد زیر را در پایتون در نظر بگیرید:

Dog class
Dog class

خیلی ساده یک class تعریف کردیم به اسم Dog که Property ای به اسم sound دارد و با Method ای به اسم talk که sound را روی کنسول نمایش می دهد.

برای نوشتن چیزی شبیه این کلاس در جاوااسکریپت (از ES6 به بعد) حداقل سه راه! می شناسم:

1-Vanilla-js way:

2- classes (after ES6):

3-Factory functions:


روش آخر با استفاده از ویژگی های تابع محور جاوااسکریپت ممکن است.

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

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

زبان های زیادی برروی جاوااسکریپت ساخته شده اند (مانند coffee script و typescript) که هدف همه آنها تمیزتر کردن جاوااسکریپت و قابل استفاده تر کردن آن در پروژه های بزرگ بوده است.

خلاصه اینکه این انعطاف پذیری جاوااسکریپت هم نقطه قوت و هم نقطه ضعف این زبان هست و اینکه به یاد داشته باشید جاوااسکریپت بیشتر یک زبان تابع محور (functional) هست تا یک زبان شئ گرا اما جامعه توسعه دهندگان این زبان دقیقا برعکس این نکته رفتار می کنند.