Codespian | کدسپین – Telegram
Codespian | کدسپین
52 subscribers
22 photos
2 videos
12 files
82 links
Codespian Official Community Channel
Admin: @AMIRALI_H0SSEINI
Download Telegram
Codespian | کدسپین
https://javanoscript.info/function-basics #JS
▎توابع

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

به عنوان مثال، نیاز داریم که یک پیام زیبا را هنگام ورود کاربر، خروج کاربر و شاید در جاهای دیگر نمایش دهیم.

توابع اصلی‌ترین "اجزای سازنده" برنامه هستند. آن‌ها اجازه می‌دهند که کد بدون تکرار چندین بار فراخوانی شود.

ما قبلاً نمونه‌هایی از توابع داخلی مانند alert(message)، prompt(message, default) و confirm(question) را دیده‌ایم. اما می‌توانیم توابع خودمان را نیز ایجاد کنیم.

▎اعلام تابع

برای ایجاد یک تابع می‌توانیم از اعلام تابع استفاده کنیم.

این به شکل زیر است:

کلیدواژه function ابتدا می‌آید، سپس نام تابع، سپس لیستی از پارامترها درون پرانتز (با کاما جدا شده، خالی در مثال بالا، که بعداً نمونه‌هایی خواهیم دید) و در نهایت کد تابع، که به آن "بدنه تابع" نیز گفته می‌شود، درون آکولادها قرار دارد.

تابع جدید ما می‌تواند با نام خود فراخوانی شود: showMessage().

به عنوان مثال:

فراخوانی showMessage() کد تابع را اجرا می‌کند. در اینجا ما پیام را دو بار مشاهده خواهیم کرد.

این مثال به وضوح یکی از اهداف اصلی توابع را نشان می‌دهد: جلوگیری از تکرار کد.

اگر هر زمان نیاز به تغییر پیام یا نحوه نمایش آن داشته باشیم، کافی است کد را در یک مکان تغییر دهیم: تابعی که آن را نمایش می‌دهد.

▎متغیرهای محلی

یک متغیر که درون یک تابع اعلام شده باشد فقط درون همان تابع قابل مشاهده است.

به عنوان مثال:

▎متغیرهای خارجی

یک تابع می‌تواند به یک متغیر خارجی نیز دسترسی داشته باشد، به عنوان مثال:

تابع به طور کامل به متغیر خارجی دسترسی دارد. همچنین می‌تواند آن را تغییر دهد.

به عنوان مثال:

متغیر خارجی فقط در صورتی استفاده می‌شود که متغیر محلی وجود نداشته باشد.

اگر یک متغیر با همان نام درون تابع اعلام شود، متغیر خارجی سایه‌دار خواهد شد. به عنوان مثال، در کد زیر تابع از userName محلی استفاده می‌کند و متغیر خارجی نادیده گرفته می‌شود:

متغیرهای جهانی

متغیرهایی که خارج از هر تابع اعلام شده‌اند، مانند userName خارجی در کد بالا، به عنوان متغیرهای جهانی شناخته می‌شوند.

متغیرهای جهانی از هر تابع قابل مشاهده هستند (مگر اینکه توسط متغیرهای محلی سایه‌دار شوند).

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

▎پارامترها

ما می‌توانیم داده‌های دلخواهی را با استفاده از پارامترها به توابع منتقل کنیم.

در مثال زیر، تابع دارای دو پارامتر: from و text است.

زمانی که تابع در خطوط (*) و (**) فراخوانی می‌شود، مقادیر داده شده به متغیرهای محلی from و text کپی می‌شوند. سپس تابع از آن‌ها استفاده می‌کند.

در اینجا یک مثال دیگر: ما یک متغیر from داریم و آن را به تابع منتقل می‌کنیم. لطفاً توجه داشته باشید: تابع from را تغییر می‌دهد، اما تغییرات در خارج دیده نمی‌شود، زیرا یک تابع همیشه یک کپی از مقدار را دریافت می‌کند:

وقتی که یک مقدار به عنوان پارامتر تابع منتقل می‌شود، همچنین به آن آرگومان گفته می‌شود.

به عبارت دیگر، برای شفاف کردن این اصطلاحات:

• پارامتر: متغیری است که درون پرانتزها در اعلام تابع ذکر شده است (این یک اصطلاح مربوط به زمان اعلام است).

• آرگومان: مقداری است که هنگام فراخوانی تابع به آن منتقل می‌شود (این یک اصطلاح مربوط به زمان فراخوانی است).

ما توابع را با ذکر پارامترهایشان اعلام می‌کنیم و سپس آن‌ها را با ارسال آرگومان‌ها فراخوانی می‌کنیم.

در مثال بالا، می‌توان گفت: "تابع showMessage با دو پارامتر اعلام شده است، سپس با دو آرگومان: from و "Hello" فراخوانی شده است".

▎مقادیر پیش‌فرض

اگر یک تابع فراخوانی شود اما آرگومانی ارائه نشود، آنگاه مقدار مربوطه undefined خواهد شد.

به عنوان مثال، تابع فوق‌الذکر showMessage(from, text) می‌تواند با یک آرگومان فراخوانی شود:

این یک خطا نیست. چنین فراخوانی "*Ann*: undefined" را نمایش خواهد داد. از آنجایی که مقدار برای text منتقل نشده است، این مقدار undefined می‌شود.

ما می‌توانیم مقدار "پیش‌فرض" (برای استفاده در صورت حذف) را برای یک پارامتر در اعلام تابع مشخص کنیم، با استفاده از =:

اکنون اگر پارامتر text منتقل نشود، مقدار "no text given" را دریافت خواهد کرد.

مقدار پیش‌فرض همچنین اگر پارامتر وجود داشته باشد اما برابر با undefined باشد نیز وارد عمل می‌شود.
Codespian | کدسپین
https://javanoscript.info/function-basics #JS
▎ارزیابی پارامترهای پیش‌فرض

در جاوااسکریپت، یک پارامتر پیش‌فرض هر بار که تابعی بدون پارامتر مربوطه فراخوانی می‌شود، ارزیابی می‌شود.

در مثال بالا، anotherFunction() در صورتی که پارامتر text ارائه شده باشد، اصلاً فراخوانی نمی‌شود. از طرف دیگر، هر بار که text ناپدید باشد، به طور مستقل فراخوانی می‌شود.

▎پارامترهای پیش‌فرض در کدهای قدیمی جاوااسکریپت

سال‌ها پیش، جاوااسکریپت از سینتکس پارامترهای پیش‌فرض پشتیبانی نمی‌کرد. بنابراین، مردم از روش‌های دیگری برای مشخص کردن آن‌ها استفاده می‌کردند.

امروزه ممکن است با این نوع کدها در اسکریپت‌های قدیمی مواجه شویم.

به عنوان مثال، بررسی صریح برای undefined:

...یا استفاده از اپراتور ||:

▎پارامترهای پیش‌فرض جایگزین

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

ما می‌توانیم بررسی کنیم که آیا پارامتر در حین اجرای تابع ارسال شده است یا نه، با مقایسه آن با undefined:

...یا می‌توانیم از اپراتور || استفاده کنیم:

موتورهای مدرن جاوااسکریپت از اپراتور هم‌ارز nullish ?? پشتیبانی می‌کنند، که بهتر است زمانی که بیشتر مقادیر نادرست مانند 0 باید به عنوان "عادی" در نظر گرفته شوند.

▎بازگشت یک مقدار

یک تابع می‌تواند یک مقدار را به کد فراخوانی بازگرداند.

ساده‌ترین مثال می‌تواند تابعی باشد که دو مقدار را جمع می‌کند:

دستوری به نام return می‌تواند در هر جایی از تابع قرار گیرد. زمانی که اجرای کد به آن برسد، تابع متوقف می‌شود و مقدار به کد فراخوانی بازگردانده می‌شود (که در مثال بالا به result اختصاص داده شده است).

ممکن است چندین بار از return در یک تابع استفاده شود. به عنوان مثال:

استفاده از return بدون یک مقدار نیز ممکن است. این باعث می‌شود که تابع فوراً خارج شود.

به عنوان مثال:

در کد بالا، اگر checkAge(age) مقدار false را برگرداند، آنگاه showMovie به نمایش پیام ادامه نخواهد داد.

یک تابع با بازگشت خالی یا بدون آن مقدار undefined را برمی‌گرداند

اگر یک تابع مقداری را بازنگرداند، مانند این است که undefined را برگرداند:

یک بازگشت خالی نیز همانند return undefined است:

⚠️ هرگز بین return و مقدار یک خط جدید اضافه نکنید

برای یک عبارت طولانی در return، ممکن است وسوسه شوید که آن را در یک خط جداگانه قرار دهید، مانند این:

این کار نمی‌کند، زیرا جاوااسکریپت بعد از return یک نقطه ویرگول فرض می‌کند. این همانند این عمل خواهد کرد:

بنابراین، عملاً به یک بازگشت خالی تبدیل می‌شود.

اگر بخواهیم عبارت بازگشتی در چندین خط پیچیده باشد، باید آن را در همان خط با return شروع کنیم. یا حداقل پرانتز باز را در آنجا قرار دهیم:

و این به همان شکلی که انتظار داریم کار خواهد کرد.

▎نام‌گذاری یک تابع

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

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

به عنوان مثال، توابعی که با "show" شروع می‌شوند معمولاً چیزی را نمایش می‌دهند.

توابعی که با شروع می‌شوند...

• "get…" – مقداری را برمی‌گرداند،

• "calc…" – چیزی را محاسبه می‌کند،

• "create…" – چیزی را ایجاد می‌کند،

• "check…" – چیزی را بررسی کرده و یک مقدار بولی برمی‌گرداند و غیره.

نمونه‌هایی از چنین نام‌هایی:

با وجود پیشوندها، یک نگاه به نام تابع درک می‌کند که چه نوع کاری انجام می‌دهد و چه نوع مقداری را بازمی‌گرداند.

یک تابع – یک عمل

یک تابع باید دقیقاً همان کاری را انجام دهد که نامش نشان می‌دهد، نه بیشتر.

دو عمل مستقل معمولاً سزاوار دو تابع هستند، حتی اگر معمولاً با هم فراخوانی شوند (در این حالت می‌توانیم یک تابع سوم بسازیم که آن دو را فراخوانی کند).

چند مثال از نقض این قانون:

• getAge – اگر پیامی با سن نمایش دهد بد است (باید فقط سن را بگیرد).

• createForm – اگر سند را تغییر دهد و فرمی به آن اضافه کند بد است (باید فقط آن را ایجاد کرده و برگرداند).

• checkPermission – اگر پیام دسترسی مجاز/ممنوع را نمایش دهد بد است (باید فقط بررسی انجام دهد و نتیجه را برگرداند).
Codespian | کدسپین
https://javanoscript.info/function-basics #JS
▎نام‌گذاری توابع

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

نام‌های فوق‌العاده کوتاه برای توابع

توابعی که به طور مکرر استفاده می‌شوند، گاهی نام‌های فوق‌العاده کوتاهی دارند.

به عنوان مثال، فریم‌ورک jQuery یک تابع با نام $ تعریف می‌کند. کتابخانه Lodash نیز تابع اصلی خود را با نام _ دارد.

این‌ها استثنا هستند. به طور کلی، نام توابع باید مختصر و توصیفی باشد.

▎تابع = نظرات

توابع باید کوتاه باشند و دقیقاً یک کار انجام دهند. اگر آن کار بزرگ است، شاید ارزشش را داشته باشد که تابع را به چند تابع کوچکتر تقسیم کنیم. گاهی اوقات پیروی از این قاعده ممکن است آسان نباشد، اما قطعاً چیز خوبی است.

یک تابع جداگانه نه تنها آزمایش و اشکال‌زدایی آن آسان‌تر است، بلکه وجود آن خود یک نظر عالی است!

برای مثال، دو تابع showPrimes(n) زیر را مقایسه کنید. هر کدام اعداد اول تا n را نمایش می‌دهند.

نسخه اول از یک برچسب استفاده می‌کند:

نسخه دوم از یک تابع اضافی به نام isPrime(n) برای بررسی اول بودن استفاده می‌کند:

نسخه دوم آسان‌تر قابل درک است، درست است؟ به جای قطعه کد، نام عمل (isPrime) را مشاهده می‌کنیم. گاهی اوقات مردم به چنین کدی به عنوان خودتوصیف اشاره می‌کنند.

بنابراین، توابع می‌توانند حتی اگر قصد استفاده مجدد از آن‌ها را نداشته باشیم، ایجاد شوند. آن‌ها کد را ساختاردهی کرده و خوانایی آن را افزایش می‌دهند.

▎خلاصه

اعلام یک تابع به این شکل است:

مقادیر ارسال شده به یک تابع به عنوان پارامترها به متغیرهای محلی آن کپی می‌شوند.

یک تابع می‌تواند به متغیرهای خارجی دسترسی داشته باشد. اما این فقط از داخل به بیرون کار می‌کند. کد خارج از تابع نمی‌تواند متغیرهای محلی آن را ببیند.

یک تابع می‌تواند یک مقدار را بازگرداند. اگر این کار را نکند، نتیجه‌اش undefined خواهد بود.

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

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

▎نام‌گذاری توابع:

• نام باید به وضوح توصیف کند که تابع چه کاری انجام می‌دهد. وقتی ما یک فراخوانی تابع را در کد مشاهده می‌کنیم، یک نام خوب بلافاصله به ما درک می‌دهد که چه کاری انجام می‌دهد و چه چیزی برمی‌گرداند.


• یک تابع یک عمل است، بنابراین نام‌های توابع معمولاً فعلی هستند.

• پیشوندهای توابع معروفی مانند create…، show…، get…، check… و غیره وجود دارد. از آن‌ها برای اشاره به اینکه یک تابع چه کاری انجام می‌دهد استفاده کنید.

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

در اینجا، توابع به‌طور مستقیم در داخل فراخوانی ask(...) اعلام شده‌اند. این توابع نام ندارند و به همین دلیل به آن‌ها توابع ناشناس (Anonymous Functions) گفته می‌شود. چنین توابعی از خارج از ask قابل دسترسی نیستند (زیرا به متغیرها اختصاص داده نشده‌اند)، اما این دقیقاً همان چیزی است که ما در اینجا می‌خواهیم.

این نوع کد به‌طور طبیعی در اسکریپت‌های ما ظاهر می‌شود و با روحیه جاوااسکریپت سازگار است.

یک تابع یک مقدار است که نمایانگر یک "عمل" است

مقادیر معمولی مانند رشته‌ها یا اعداد نمایانگر داده‌ها هستند.

یک تابع می‌تواند به‌عنوان یک عمل درک شود.

ما می‌توانیم آن را بین متغیرها منتقل کنیم و هر زمان که بخواهیم اجرا کنیم.

تفاوت بین اعلام تابع و بیان تابع

بیایید تفاوت‌های کلیدی بین اعلام تابع (Function Declarations) و بیان تابع (Function Expressions) را فرموله کنیم.

اول، نحوه تشخیص آن‌ها در کد:

اعلام تابع: تابعی که به‌عنوان یک بیانیه جداگانه در جریان اصلی کد تعریف شده است:

function sayHi() {
console.log("Hello!");
}


بیان تابع: تابعی که در داخل یک عبارت یا ساختار نحوی دیگر ایجاد می‌شود. در اینجا، تابع در سمت راست عبارت انتساب (=) ایجاد می‌شود:

let sum = function(a, b) {
return a + b;
};


تفاوت ظریف‌تر: زمانی که تابع توسط موتور جاوااسکریپت ایجاد می‌شود.

یک بیان تابع زمانی ایجاد می‌شود که اجرا به آن نقطه برسد و تنها از آن لحظه قابل استفاده است.

زمانی که جریان اجرا به سمت راست عبارت انتساب let sum = function... می‌رسد، تابع ایجاد شده و از آن زمان می‌توان از آن استفاده کرد (به آن اختصاص داد، فراخوانی کرد و غیره).

اعلام توابع متفاوت هستند.

یک اعلام تابع می‌تواند زودتر از زمانی که تعریف شده است، فراخوانی شود.

به‌عنوان مثال، یک اعلام تابع جهانی در کل اسکریپت قابل مشاهده است، هرچند که در کجا قرار داشته باشد.

این به دلیل الگوریتم‌های داخلی است. وقتی جاوااسکریپت آماده اجرای اسکریپت می‌شود، ابتدا به دنبال اعلام‌های تابع جهانی در آن می‌گردد و توابع را ایجاد می‌کند. می‌توانیم این مرحله را به‌عنوان یک "مرحله اولیه" در نظر بگیریم.

و پس از پردازش تمام اعلام‌های تابع، کد اجرا می‌شود. بنابراین به این توابع دسترسی دارد.

به‌عنوان مثال، این کار می‌کند:

sayHi(); // Hello!
function sayHi() {
console.log("Hello!");
}


تابع sayHi زمانی که جاوااسکریپت آماده شروع اسکریپت است، ایجاد می‌شود و در سراسر آن قابل مشاهده است.

…اگر این یک بیان تابع بود، پس این کار نمی‌کرد:

بیان‌های تابع زمانی ایجاد می‌شوند که اجرا به آن‌ها برسد. این فقط در خط (*) اتفاق می‌افتد. خیلی دیر است.

ویژگی خاص دیگر اعلام توابع

ویژگی خاص دیگر اعلام توابع، دامنه بلوکی آن‌هاست.

در حالت سخت (Strict Mode)، وقتی یک اعلام تابع درون یک بلوک کد قرار دارد، در تمام نقاط داخل آن بلوک قابل مشاهده است. اما نه خارج از آن.

برای مثال، فرض کنید که ما نیاز داریم تا تابع welcome() را بر اساس متغیر age که در زمان اجرا دریافت می‌کنیم، اعلام کنیم. سپس قصد داریم از آن بعداً استفاده کنیم.

اگر از اعلام تابع استفاده کنیم، این کار به‌درستی انجام نمی‌شود:

if (age > 18) {
function welcome() {
console.log("Welcome!");
}
}
welcome(); // Error: welcome is not defined


این به این دلیل است که یک اعلام تابع تنها در داخل بلوک کدی که در آن قرار دارد قابل مشاهده است.

راه‌حل

چه کار کنیم تا welcome خارج از if قابل مشاهده باشد؟

روش صحیح این است که از بیان تابع استفاده کرده و welcome را به متغیری که خارج از if اعلام شده و دارای دید مناسب است اختصاص دهیم.

این کد به‌درستی کار می‌کند:

let welcome;

if (age > 18) {
welcome = function() {
console.log("Welcome!");
};
}

welcome(); // Welcome!


یا می‌توانیم این را حتی ساده‌تر کنیم با استفاده از عملگر سوالی ?:

let welcome = age > 18 ? function() { console.log("Welcome!"); } : null;


چه زمانی باید از اعلام تابع و چه زمانی از بیان تابع استفاده کنیم؟

به‌طور کلی، وقتی نیاز داریم تا یک تابع را اعلام کنیم، اولین چیزی که باید در نظر بگیریم، نحو اعلام تابع است. این نحو آزادی بیشتری برای سازماندهی کد ما فراهم می‌کند، زیرا می‌توانیم چنین توابعی را قبل از اینکه تعریف شوند فراخوانی کنیم.
Codespian | کدسپین
https://javanoscript.info/function-expressions #JS
این همچنین برای خوانایی بهتر است، زیرا پیدا کردن function f(…) {…} در کد آسان‌تر از let f = function(…) {…}; است. اعلام توابع بیشتر "جلب توجه" می‌کنند.

…اما اگر به هر دلیلی اعلام تابع مناسب ما نباشد، یا نیاز به یک اعلام شرطی داشته باشیم (که در مثال قبلی دیدیم)، پس باید از بیان تابع استفاده کنیم.

▎خلاصه

توابع مقادیر هستند. آن‌ها می‌توانند اختصاص داده شوند، کپی شوند یا در هر جایی از کد اعلام شوند.

اگر تابع به‌عنوان یک بیانیه جداگانه در جریان اصلی کد اعلام شود، به آن "اعلام تابع" گفته می‌شود.

اگر تابع به‌عنوان بخشی از یک عبارت ایجاد شود، به آن "بیان تابع" گفته می‌شود.

▎اعلام توابع و بیان توابع در جاوااسکریپت

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

بیان توابع زمانی ایجاد می‌شوند که جریان اجرا به آن‌ها برسد.

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

بنابراین، ما باید از بیان تابع تنها زمانی استفاده کنیم که اعلام تابع برای وظیفه مورد نظر مناسب نباشد. در این فصل چند مثال از این موضوع را دیده‌ایم و در آینده نیز بیشتر خواهیم دید.
پرامپت درست = یادگیری سریع 👌🏻

وقتی در حال مطالعه داکیومنت یه قسمتی رو خوب متوجه نمیشین و برای درک بیشتر می‌خواین از هوش مصنوعی استفاده کنین، متن داکیومنت رو براش ارسال کنین و به جای ″درخواست ترجمه″ ازش بخواین اون موضوع رو بهتون ″یاد بده″

این تیکه رو برام ترجمه کن.
این تیکه رو بهم یاد بده.

با همین نکته ریز هوش مصنوعی با دیدِ تدریس بهتون جواب میده و برای درک بهتر اون موضوع براتون چندتا مثال می‌زنه✌️🏻❤️

📌 اگه باز هم متوجه نشدین مجددا ازش بخواین مثال های بیشتری براتون بزنه یا بیشتر توضیح بده.
2👍1
داشتن اپلیکیشن های مرتبط با برنامه نویسی باعث میشن ناخودآگاه وقتمون رو بیشتر صرف یادگیری و پیشرفت بکنیم


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


این اسکرین‌شات از ۹ اپلیکیشن مربوط به کوئیزها، سوالات مصاحبه‌ای و ... هست که خودم ازشون استفاده می‌کنم و پیشنهاد می‌کنم اگه شما هم با جاوا اسکریپت کار می‌کنین نصب کرده و ازشون استفاده کنین💡


تک تک این اپلیکیشن‌ها رو می‌تونین از Google Play دانلود کنین و لذتشو ببرین ❤️
👍1