مقدمه

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

جاوااسکریپت و پویایی صفحات وب

در سال‌های ابتدایی پیدایش وب، صفحات یا اسناد وب به صورت ایستا (static) منتشر می‌شدند و پس از بارگذاری در مرورگر، امکان تعامل با کاربر را نداشتند. اولین کسانی که برای برطرف کردن این محدودیت و اعطای پویایی و تعامل‌پذیری (interactivity) به صفحات وب دست‌به‌کار شدند، متخصصان و توسعه‌دهندگان شرکت Netscape بودند. این گروه در سال 1993 اولین مرورگر وب دارای رابط کاربری گرافیکی (GUI) را با نام Mosaic منتشر کردند و یک سال بعد، کمپانی Netscape را تأسیس کرده و از یک مرورگر کاربرپسند با نام Navigator (که جد مرورگر محبوب firefox محسوب می‌شود) در این کمپانی رونمایی کردند. متخصصان این شرکت با هدف برطرف کردن محدودیت عدم پویایی و تعامل‌پذیری صفحات وب، به فکر پیاده‌سازی یک زبان اسکریپت‌نویسی در مرورگر Navigator افتادند. آنها برای حصول این هدف، ابتدا سعی در جاسازی زبان‌های جاوا و Scheme در مرورگر خود داشتند اما نهایتاً به این نتیجه رسیدند که یک زبان اسکریپت‌نویسی را از صفر ایجاد کنند و آن را در مرورگر خود پیاده‌سازی کنند.

در سال 1995 آقای Brendan Eich (هم‌بنیانگذار پروژه و مؤسسه‌ی موزیلا) یکی از مهندسین کمپانی Netscape زبان اسکریپت‌نویسی مورد نظر را برای استفاده در مرورگر Navigator خلق کرد. شرکت Netscape ابتدا این زبان جدید را Mocha نام گذاشت اما هنگام پیاده‌سازی آن در مرورگر Navigator از نام Livescript برای این زبان استفاده کرد و در Navigator 2 که در سال 1996 منتشر شد، این زبان را JavaScript نام گذاشت. خیلی‌ها معتقدند که Livescript انتخاب مناسب‌تری برای نام این زبان جدید بود اما به هر حال، بخش بازاریابی کمپانی Netscape شاید به دلیل بهره بردن از شهرت زبان جاوا که در آن سال‌ها محبوبیت زیادی داشت، ترجیح دادند که از نام جاوااسکریپت برای این زبان استفاده کنند. به هر حال، همانطور که گفته شد، زبان‌های جاوا و جاوااسکریپت جز همین شباهت نام، هیچ ارتباط دیگری با هم ندارند.

چند ماه بعد، مایکروسافت با معرفی زبانی مشابه جاوااسکریپت با نام Jscript و پیاده‌سازی آن در سومین نسخه از مرورگر Internet Explorer یا IE وارد میدان رقابت شد و به این ترتیب، جنگی که بر سر تصاحب بازار مرورگرهای وب بین این دو کمپانی در جریان بود، وارد فاز جدیدی شد. البته مایکروسافت با ارائه‌ی یک سری مقالات، سعی داشت نشان دهد که Jscript ارتباطی به جاوااسکریپت ندارد و یک کپی از آن محسوب نمی‌شود.

جنگ مرورگرها

در گام بعدی، شرکت Netscape زبان جدید خود را با هدف استانداردسازی به ECMA یا همان انجمن اروپایی سازندگان کامپیوتر سپرد. البته به خاطر اینکه شرکت Sun Microsystems (اوراکل امروزی) دارای لایسنس نشان تجاری جاوااسکریپت بود، امکان استفاده از نام جاوااسکریپت برای این استاندارد جدید وجود نداشت و در سال 1997 اولین نسخه از این استاندارد با نام رسمی و کمتر مصطلح ECMAScript منتشر شد.

به این ترتیب، JavaScript و Jscript هر کدام به عنوان یک پیاده‌سازی (implementation) از استاندارد ECMAScript که به اختصار ES نامیده می‌شود، در اختیار برنامه‌نویسان وب قرار گرفتند. در این بین، موضوع آزاردهنده تفاوت‌های موجود بین این دو پیاده‌سازی بود که کار طراحان وب را برای نوشتن کدهایی که در هر دو مرورگر به شکل یکسانی اجرا شوند، مشکل می‌کرد.

استاندارد ES و پیاده‌سازی‌های آن

جاوااسکریپت (JS) نام یکی از پیاده‌سازی‌های استاندارد ECMAScript یا همان ES است و پیاده‌سازی‌های دیگری نیز از این استاندارد وجود دارد. برای نمونه، Jscript پیاده‌سازی ES توسط مایکروسافت است و یا شرکت Adobe یک پیاده‌سازی از این استاندارد با نام ExtendScript را در نرم‌افزارهای Photoshop و Acrobat ارائه داده و یا پیاده‌سازی دیگری با نام ActionScript نیز در نرم‌افزار Animate این کمپانی ارائه شده است. نکته‌ای که باید بدانید این است که وقتی شخص یا شرکتی قصد پیاده‌سازی یک استاندارد را دارد، باید همه‌ی ویژگی‌های تعریف شده در آن استاندارد را پیاده‌سازی کند و این یک الزام محسوب می‌شود. اما از طرف دیگر، این آزادی عمل وجود دارد که فرد پیاده‌سازی‌کننده ویژگی‌ها و قابلیت‌های اضافی مد نظرش را نیز به پیاده‌سازی خود اضافه کند. از اینرو در دوران جنگ مرورگرها شرکت‌های مایکروسافت و Netscape سعی داشتند با ارائه‌ی ویژگی‌های اضافی جذاب‌تر و مفیدتر، کاربران را به استفاده از مرورگر خود ترغیب کنند.

در زمان انتشار Navigator 4 و IE 4 استاندارد ES به محبوبیت زیادی دست پیدا کرده بود و مایکروسافت سعی در ترغیب کاربران به استفاده از مرورگر IE 4 داشت و Netscape نیز با عرضه‌ی نسخه‌ی چهارم مرورگر Navigator به دنبال دریافت سهم عمده‌ی بازار بود. تفاوت‌های موجود بین پیاده‌سازی‌های ارائه شده توسط این دو شرکت در مرورگرهایشان یعنی JavaScript در Navigator و JScript در IE و تلاش برای بدست آوردن سهم عمده‌ی بازار به اوج رسیده بود و از آن روزها با نام دوران جنگ اول مرورگرها یاد می‌شود. جنگی که سرانجام با پیروزی مایکروسافت به پایان رسید و سهم مرورگر این کمپانی یعنی IE در آن سال‌ها تا 95٪ هم رسید. البته وقتی توسعه‌دهندگان Navigator شرکت Mozilla را تأسیس کرده و در سال 2004 مرورگر Firefox را معرفی کردند، روز‌به‌روز به کاربران این مرورگر مدرن اضافه شد و وضعیت بازار تغییر کرد.

با افزایش محبوبیت جاوااسکریپت در بین توسعه‌دهندگان، جنگ دوم مرورگرها شروع شد. البته این بار جنگ نه بر سر افزودن امکانات جدید به مرورگرها بلکه بر سر پشتیبانی بیشتر و بهتر از استانداردها و نیز افزایش سرعت اجرای کدهای جاوااسکریپت بود. در سال 2008 کمپانی گوگل وارد میدان شد و از مرورگر Chrome که به یک موتور جاوااسکریپت جدید با نام V8 مجهز بود، رونمایی کرد که کدهای جاوااسکریپت را با سرعت بسیار بیشتری نسبت به سایر موتورهای جاوااسکریپت اجرا می‌کرد و نتیجتاً بازار به سمت این مرورگر گرایش پیدا کرد و مطابق آمارهای ارائه شده در حال حاضر، این مرورگر با اختلافی چشمگیر در صدر جدول مرورگرهای محبوب دنیا قرار دارد.

یکی از دلایل مهم رشد و گسترش جاوااسکریپت در بین توسعه‌دهندگان، ظهور تکنولوژی AJAX و سایت‌هایی مانند Google Maps بود که با تکیه بر این تکنولوژی ایجاد شده بودند. به این ترتیب، توسعه‌دهندگان دریافتند که جاوااسکریپت را می‌توان برای تولید اپلیکیشن‌های وب قدرتمند به کار برد و با استفاده از این زبان، نرم‌افزارهای تحت وب مشابه نرم‌افزارهای دسکتاپ را ایجاد کرد. تکنولوژی AJAX که روشی برای دریافت اطلاعات از سرور در پس‌زمینه و بدون نیاز به بارگذاری مجدد کل صفحه بود، به پیشرفت جاوااسکریپت کمک قابل توجهی کرد و توجه تعداد زیادی از توسعه‌دهندگان را جلب کرد. حالا دیگر کسی نمی‌توانست جاوااسکریپت را به یک اسباب‌بازی تشبیه کند!

نسخه‌ها و مودهای ECMAScript

در نسخه‌های ابتدایی استاندارد ECMAScript (نسخه‌های قبل از ES5) تعدادی ویژگی عجیب و بحث‌برانگیز وجود دارد که با رشد زبان سعی در اصلاح آنان شده است. البته اپلیکیشن‌ها و وبسایت‌های زیادی با استفاده از نسخه‌های قدیمی ایجاد شده و بنابراین برای حفظ سازگاری این نسخه‌های قدیمی یا backward compatibility امکان حذف این ویژگی‌ها از زبان وجود ندارد.

روشی که توسعه‌دهندگان جاوااسکریپت برای حل این مشکل انتخاب کرده‌اند، این است که به کاربران امکان بدهند که بتوانند در یکی از دو حالت (mode) معمولی یا سخت‌گیرانه کدنویسی کنند. در مود معمولی که legacy mode نیز گفته می‌شود، همه‌ی ویژگی‌های ES در دسترس هستند اما در مود سخت‌گیرانه یا strict mode برخی ویژگی‌های غیرمتعارف، غیر قابل استفاده هستند. برای کدنویسی در مود سخت‌گیرانه کافیست عبارت 'use strict' را در بالای فایل .js خود قرار دهید. در ضمن، اگر بخواهید مود سختگیرانه را فقط روی یک بلاک مشخص از کدها فعال کنید، باید عبارت 'use strict' را به جای بالای سند، در بالای همان بلاک وارد کنید. نکته‌ی دیگر اینکه از ES6 به بعد، بعضی از ساختارها مانند کلاس‌ها و ماژول‌ها به طور ضمنی در مود سختگیرانه قرار دارند و امکان کدنویسی legacy در این ساختارها وجود ندارد.

اولین نسخه از استاندارد ES در سال 1997 معرفی شد و طی دو سال بعد دو نسخه‌ی دیگر از آن معرفی شد که البته با تغییرات چشمگیری همراه نبودند. نسخه‌ی ES4 بعد از سال‌ها کار و آزمایش به خاطر اختلاف بر سر پیچیدگی‌های این نسخه که به نظر بعضی از توسعه‌دهندگان این استاندارد، سادگی این زبان را فدای افزایش قدرت آن می‌کرد، کنار گذاشته شد. ویژگی‌های این نسخه‌ی منتشر نشده بعدها در قالب دو نسخه‌ی ES5 و ES6 منتشر شد. نسخه‌ی ES5 که در سال 2009 ارائه شد، نسبت به نسخه‌های پیشین با تفاوت‌ها و بهبودهای زیادی همراه بود. انتشار نسخه‌ی بعدی این استاندارد شش سال طول کشید و در سال 2015 نسخه‌ی انقلابی ES6 معرفی شد که نقطه‌ی عطفی در تاریخچه‌ی این زبان محسوب می‌شود. از آن سال به بعد، قرار شد که نسخه‌های جدید ES به صورت سالانه معرفی شوند. جدول زیر لیست نسخه‌های استاندارد ES را به همراه سال انتشار و تعدادی از مهمترین ویژگی‌های هر نسخه ارائه می‌دهد.

نسخه سال انتشار توضیح
ES1 1997 اولین ویرایش استاندارد ES که شامل ویژگی‌های اساسی و ابتدایی مورد نیاز برای یک زبان اسکریپت‌نویسی تفسیری (interpreted) بود.
ES2, ES3 1998, 1999 این دو نسخه به فاصله‌ی کمتر از یک سال معرفی شدند و با برخی تغییرات ویرایشی و نیز مواردی مثل عبارات منظم یا regular expressions و ساختار try/cath برای مدیریت خطاها همراه بودند.
ES5 2009 در این نسخه تغییراتی اساسی را شاهد بودیم و مواردی مانند پشتیبانی از فرمت json و متدهایی برای کار با آرایه‌ها و رشته‌های متنی از جمله مهترین امکانات اضافه شده به این ویرایش بودند.
ES6 2015 این نسخه با ویژگی‌های اساسی مانند سینتکس کلاس و ماژول همراه بود که جاوااسکریپت را از یک زبان اسکریپت‌نویسی به یک زبان برنامه‌نویسی چندمنظوره و مناسب برای مهندسی نرم‌افزار در مقیاس وسیع تبدیل کرد.
ES2016 2016 در این ویرایش، تغییرات کوچکی مانند معرفی یک عملگر جدید (**) برای انجام محاسبات توانی در ریاضیات و چند متد جدید برای کار با داده‌ها به زبان اضافه شدند.
ES2017 2017 چند متد جدید برای کار با اشیاء و رشته‌های متنی و نیز توابع async مهمترین قابلیت‌های ارائه‌شده در این ویرایش بودند.
ES2018 2018 در این ویرایش نیز بهبودها و اصلاحاتی برای کار با عبارات منظم ارائه شد.
ES2019 2019 در این نسخه، متدهای جدیدی برای کار با آرایه‌ها و اشیاء و تبدیل آنها به یکدیگر و نیز بهبودهایی در ساختار try-cath و تعدادی ویژگی دیگر به زبان اضافه شدند.
ES2020 2020 در این نسخه امکان کار با اعداد صحیح خیلی بزرگ و نیز بهبودهایی در import و export ماژول‌ها مانند امکان import کردن ماژول به صورت دینامیک (یعنی همان کاری که webpack یا babel انجام می‌دهند) به زبان افزوده شده است.
ES2021 2021 در این نسخه نیز تعدادی ویژگی پیشرفته برای کار با promise و finalizer به همراه مواردی مانند امکان استفاده از کاراکتر underscore به عنوان جداکننده‌ی ارقام و امکان ترکیب عملگرهای منطقی با عملگر تخصیص معرفی شدند.
ES2022 2022 در این نسخه ویژگی‌هایی مانند امکان تعریف فیلدها و متدهای private، امکان تعریف اعضای استاتیک و بهبودهایی در ارتباط با برنامه‌نویسی موازی معرفی شد.
ES2023 2023 در این نسخه تعدادی قابلیت و متد جدید که بیشتر آنها به آرایه‌ها و شیء Promise مربوط هستند، معرفی شد.

توجه داشته باشید که بعد از ارائه‌ی یک نسخه‌ی جدید از استاندارد ES، باید مدتی سپری شود تا مرورگرها خود را با ویژگی‌های نسخه‌ی جدید سازگار کنند و به عبارت دیگر، پشتیبانی از آن ویژگی‌ها را به مرورگر خود اضافه کنند. وبسایت CanIUse مرجعی بسیار کارامد برای بررسی وضعیت پشتیبانی مرورگرها از امکانات و ویژگی‌های ES است.