یکی از ویژگیهای زبان جاوا اسکریپت این است که تمام کد برنامه فقط در یک «ریسه» (thread) اجرا میشود. این از خصوصیات اصلی زبان جاوا اسکریپت است. با این حال، مرورگر یا محیط میزبان دیگری که جاوا اسکریپت در آن اجرا میشود، مانند تمام برنامههای مهم دیگر قابلیت چندریسهای دارد. منظور از این اصطلاح آن است که مرورگر میتواند همزمان چندین کار را انجام دهد. در غیر این صورت، مثلاً اگر روی دکمهای کلیک کنید که نیازمند گرفتن اطلاعاتی از اینترنت باشد، در مدتی که این اطلاعات دریافت میشود، رابط کاربری برنامه قفل میشد و در این مدت امکان تعامل با برنامه را نداشتید.
با وجود آنکه برنامههای جاوا اسکریپت تنها در یک ریسه اجرا میشوند، ولی بسیاری از وظایفی که توسط محیط میزبان انجام میشود، در ریسههای متعدد اجرا میگردد. با این حال، وقتی که چنین کاری را از محیط میزبان درخواست میکنید، جریان برنامه متوقف نمیشود و برنامه به اجرا ادامه میدهد. زمانی که وظیفهی مذکور به انجام رسید، از طریق یک تابع بازخوان (callback) به کد جاوا اسکریپت شما اطلاع داده میشود تا اقدام لازم بر اساس نتیجهی به دست آمده انجام شود. به این مفهوم، «برنامهنویسی ناهمگام» میگویند.
توابع بازخوان خصوصاً با همهگیر شدن فناوری ایجکس در جاوا اسکریپت متداول شدند. محیط برنامهنویسی NodeJS که یکی از مهمترین محیطهای برنامهنویسی جاوا اسکریپت برای سمت سرور است، اصولاً بر پایهی توابع بازخوان بنا شده است. یعنی اکثر توابع بومی (native) نُود از توابع بازخوان برای برگرداندن نتیجهی خود استفاده میکنند. به این ترتیب، برای برنامهنویسی نُود لازم است که تسلط کافی بر برنامهنویسی ناهمگام داشته باشید.
در سالهای اخیر، فناوری Promise و امروزه نیز کلیدواژههای async و await به جاوا اسکریپت اضافه شدهاند که برنامهنویسی ناهمگام را بسیار قدرتمندتر میسازند. از آنجا که هر یک از اینها اهمیت زیادی دارند، در پست جداگانهای به تفصیل دربارهی آنها بحث خواهم کرد.