آموزش Eval در جاوا اسکریپت
تابع eval در جاوا اسکریپت نوعی تابع داخلی است که میتوان به صورت سراسری به آن دسترسی داشت، به این معنی که شما به عنوان یک برنامهنویس میتوانید بدون نیاز به اتصال آن به شی خاصی از آن استفاده کنید. هدف از این تابع ارزیابی رشتههایی است که حاوی کد جاوا اسکریپت هستند.
eval به شما امکان میدهد رشتهای را بگیرید که کد جاوا اسکریپت را در خود جای داده و آن را طوری اجرا کنید که گویی مستقیماً در برنامه شما نوشته شده است. این رویکرد میتواند زمانی مفید باشد که ورودیهای کاربر از نوع رشته نیاز به پردازش داشته باشند. در این مطلب آموزش جاوا اسکریپت از سبزلرن تابع eval را با رویکردی آموزشی مورد بررسی قرار خواهیم داد.
تابع Eval در جاوا اسکریپت چیست؟
تابع eval در جاوا اسکریپت برای ارزیابی عبارات استفاده میشود. زمانی که آرگومان ارائه شده به eval حاوی یک یا چند عبارت جاوا اسکریپت باشد، این تابع آن عبارات را ارزیابی میکند. توجه به این نکته مهم است که ما معمولاً از eval برای ارزیابی عبارات حسابی استفاده نمیکنیم زیرا جاوا اسکریپت عبارات حسابی را به طور خودکار مدیریت میکند.
همچنین شایان ذکر است که eval قبلاً برای ارزیابی رشته به عنوان کد جاوا اسکریپت استفاده میشد. با این حال، اکنون این تابع به دلیل خطرات امنیتی بالقوه منسوخ تلقی شده و اغلب به جزء در موارد خاص، غیر ضروری است.
سینتکس eval در جاوا اسکریپت
سینتکس تابع eval در Javascript به شرح زیر است:
eval(expression);
در سینتکس فوق، expression نشاندهنده رشتهای است که شامل یک یا چند عبارت است. به عنوان مثال، یک عبارت میتواند چیزی شبیه 4 + 11 یا عبارتی مانند alert(“Hello”) باشد.
پارامترهای eval در Javascript
تابع eval در زبان برنامهنویسی جاوا اسکریپت فقط یک پارامتر را میپذیرد که آن هم پارامتر string است. این پارامتر انتظار ورودی رشته را دارد. رشته میتواند شامل عبارت، دستور یا دنبالهای از دستورات باشد. همچنین این عبارت یا عبارات ممکن است شامل متغیرها، توابع یا اشیا در جاوا اسکریپت باشند.
مقدار بازگشتی تابع eval
هنگامی که eval با آرگومان رشتهای ارائه میشود، مقدار حاصل از اجرای کد درون رشته را محاسبه میکند. اگر کد ارزیابی شده مقداری تولید کند، eval آن مقدار را برمیگرداند. با این حال، اگر مقدار محاسبه شده وجود نداشته باشد، undefined بازگردانده میشود.
استثناهای eval در Javascript
اگر آرگومانی غیر رشتهای برای تابع eval در جاوا اسکریپت ارائه کنیم، به سادگی همان آرگومان را بدون انجام هیچگونه تغییری برمیگرداند که مثال زیر برای بیان این هدف است:
let arr = [1, 2, 3]; let output = eval(arr); console.log(output);
خروجی کد بالا به صورت زیر است:
[1، 2، 3]
در مثال فوق، آرایه (arr) را به عنوان آرگومان به eval ارسال کردیم. از آنجایی که آرگومان غیر رشتهای است، eval آرایه را بدون تغییر بازمیگرداند. همچنین توجه به مثال زیر نیز مهم است:
var a = 3; var multiply_str; var output; multiply_str = "a * 7"; output = eval(multiply_str); console.log(output);
خروجی کد بالا به صورت زیر است:
21
در مثال فوق، متغیر a با مقدار 3 مقداردهی اولیه کردیم. سپس، متغیر دیگری multiply_str ایجاد کردیم و به آن رشته a * 7 اختصاص دادیم که بیانگر عبارتی برای ضرب a در 7 است.
var a = 3; var multiply_str; var output; multiply_str = "a * 7";
ما در این مثال از eval برای ارزیابی این عبارت رشته استفاده کردیم. تابع eval عبارت را اجرا کرد و در نتیجه مقدار 21 ایجاد شد که سپس در متغیر output ذخیره و در کنسول چاپ شد.
output = eval(multiply_str); console.log(output);
eval در جاوا اسکریپت چگونه کار میکند؟
تابع eval در زبان برنامهنویسی جاوا اسکریپت با در نظر گرفتن نوعی رشته به عنوان آرگومان عمل میکند. اگر رشته حاوی عبارت باشد، eval آن عبارت را ارزیابی میکند. به طور مشابه، اگر رشته حاوی دستور باشد، eval آن عبارت را ارزیابی خواهد کرد.
چرا نباید از eval در Javascript استفاده کنیم؟
دلایل متعددی برای عدم استفاده از تابع eval وجود دارد که از مهمترین این دلایل میتوان موارد زیر را نام برد:
- تأثیر عملکرد
تابع eval به کندی اجرا شود زیرا هر بار که از آن استفاده میشود مفسر جاوا اسکریپت را فعال میکند.
- خطرات امنیتی
اگر رشته ارائه شده به eval حاوی کد مخرب باشد، به طور بالقوه میتواند منجر به حملات بدافزار به سیستم یا سرور برنامهنویس شود.
- خوانایی کد
استفاده از eval میتواند خواندن و درک کد را سختتر کند که این مسئله میتواند منجر به چالشها و باگهای نگهداری شود.
مثالهایی از تابع Eval در زبان جاوا اسکریپت
در این بخش برای درک بهتر تابع eval چند مثال ساده و پیچیده را به همراه توضیحات مربوطه را ارائه خواهیم کرد.
مثال 1 | استفاده از eval برای فراخوانی تابع
قطعه کد زیر برای استفاده از eval در جاوا اسکریپت برای فراخوانی تابع مدنظر است:
// defining a function function mean(a, b) { return (a + b) / 2; } // creating a variable to store the result let ans; // using the eval() function ans = eval("mean(20, 13)"); // displaying the result console.log(ans);
خروجی کد بالا به صورت زیر است:
16.5
در کد بالا با تعریف تابعی به نام mean کار را شروع میکنیم که دو پارامتر a و b را میگیرد. این تابع میانگین دو عدد را محاسبه میکند.
function mean(a, b) { return (a + b) / 2; }
در مرحله بعد، متغیری به نام ans ایجاد میکنیم تا نتیجه ارزیابی را ذخیره کند.
let ans;
ما از تابع eval برای ارزیابی رشته mean(20,13) استفاده میکنیم. این رشته نوعی فراخوانی تابع به mean را با آرگومانهای 20 و 13 نشان میدهد. تابع eval فراخوانی تابع را در رشته اجرا میکند و نتیجه را برمیگرداند که میانگین دو عدد 20 و 13 است.
ans = eval("mean(20, 13)");
در نهایت نتیجه (16.5) را روی کنسول چاپ میکنیم.
console.log(ans);
مثال 2 | استفاده از eval با دستورات جاوا اسکریپت
در این بخش مثال استفاده از eval با دستورات جاوا اسکریپت را بررسی میکنیم که برای این هدف قطعه کد زیر مدنظر است:
// creating variables let time = 7; let statement_str; // writing the if else conditional inside a string statement_str = "if(time >= 6 && time <= 10) {'Time to wake up!';} else {'You are late.';}" // displaying the output console.log(eval(statement_str));
خروجی کد بالا به صورت زیر است:
Time to wake up!
در مثال فوق ما با اعلام دو متغیر کار را شروع میکنیم: time که مقدار 7 به آن اختصاص داده شده است و statement_str که از آنها برای ذخیره رشته حاوی دستور شرطی جاوا اسکریپت استفاده میکنیم.
let time = 7; let statement_str;
در مرحله بعد، رشتهای میسازیم که بیانگر نوعی عبارت شرطی if-else است. این رشته بررسی میکند که آیا مقدار time بین 6 و 10 باشد. اگر چنین باشد، رشته پیغام Time to wake up! را برمیگرداند. در غیر این صورت، You are late را بازخواهد گرداند.
statement_str = "if(time >= 6 && time <= 10) {'Time to wake up!';} else {'You are late.';}"
ما از تابع eval برای ارزیابی رشته statement_str به عنوان دستور جاوا اسکریپت استفاده میکنیم. این بدان معنی است که مفسر جاوا اسکریپت رشته را طوری پردازش میکند که گویی مستقیماً در کد نوشته شده است. از آنجایی که مقدار time برابر با ٧ است، شرط time >= 6 && time <= 10 درست، بنابراین بلوک if اجرا میشود و در نتیجه پیام Time to wake up! در کنسول چاپ خواهد شد.
console.log(eval(statement_str));
مثال بالا نشان میدهد که چگونه eval در جاوا اسکریپت میتواند برای اجرای پویا عبارات جاوا اسکریپت ذخیره شده به عنوان رشتهها استفاده شود. با این حال، به دلیل خطرات امنیتی بالقوه و نگرانیهای مربوط به خوانایی کد، هنگام استفاده از eval باید محتاط بود.
مثال 3 | ارسال شی رشته به عنوان آرگومان
مثال زیر مربوط به ارسال شی رشته به عنوان آرگومان بوده که قطعه کد آن به صورت زیر است:
// creating a variable and using eval() function let output = eval(new String("4 + 11")); // displaying the output console.log(output);
خروجی مثال بالا به صورت زیر است:
4 + 11
ما کار را با ایجاد متغیری به نام output شروع میکنیم.
let output
در مرحله بعد از تابع eval با آرگومان استفاده میکنیم که نمونه جدیدی از شی String است. رشته موجود در این شی «4 + 11» است.
let output = eval(new String("4 + 11"));
هنگامی که eval با شی رشته به عنوان آرگومان اجرا میشود، رشته را به عنوان کد جاوا اسکریپت ارزیابی نمیکند. در عوض، آرگومان را به عنوان نوعی رشته معمولی در نظر میگیرد و آن را همانطور که هست برمیگرداند؛ بنابراین، خروجی که میبینیم رشته 4 + 11 است.
console.log(output); // 4 + 11
در مثال فوق، eval هیچ ارزیابی روی رشته انجام نمیدهد زیرا به عنوان یک شی رشته ارسال میشود و در نتیجه رشته اصلی بدون تغییر برگردانده خواهد شد. درک این رفتار هنگام کار با eval و اشیاء رشته در جاوا اسکریپت ضروری است.
مثال 4 | استفاده از eval در جاوا اسکریپت با شی JSON
در زیر مثالی از نحوه ااستفاده از eval در Javascript با شی JSON آورده شده است:
// creating a variable let object_str; // creating a string representing a JSON object object_str = "({'Company': 'Google', 'Profile': ['Backend Dev.', 'Software Dev.'], 'Salary': [100000, 120000]})"; // using the eval() function to convert the string to a JavaScript object const job_desc = eval(object_str); // displaying the result console.log("The salary at ", job_desc.Company, " for a ", job_desc.Profile[0], " is ", job_desc.Salary[0]);
خروجی مثال فوق به صورت زیر است:
The salary at Google for a Backend Dev. is 100000
دوباره با ایجاد متغیری به نام object_str شروع میکنیم.
let object_str;
در مرحله بعد، نوعی رشته object_str تعریف میکنیم که شی JSON را نشان میدهد. این رشته شامل جفتهای کلید-مقدار است که اطلاعات مربوط به شغل مانند نام شرکت، مشخصات شغل و حقوق را نشان میدهد.
object_str = "({'Company': 'Google', 'Profile': ['Backend Dev.', 'Software Dev.'], 'Salary': [100000, 120000]})";
ما از تابع eval در جاوا اسکریپت برای ارزیابی رشته object_str به عنوان کد جاوا اسکریپت استفاده میکنیم. این تابع رشته را به شی جاوا اسکریپت تبدیل میکند که ما آن را به متغیر job_desc اختصاص میدهیم.
const job_desc = eval(object_str);
در نهایت، برای نمایش اطلاعات مربوط به شغل، به ویژگیهای شیء job_desc (Company، Profile، Salary) دسترسی پیدا میکنیم. در این مورد، نام شرکت، مشخصات شغلی و حقوق یک موقعیت شغلی خاص را چاپ میکنیم.
console.log("The salary at ", job_desc.Company, " for a ", job_desc.Profile[0], " is ", job_desc.Salary[0]);
مثال فوق در اصل نشان میدهد که چگونه eval میتواند برای تبدیل پویا رشتهای که شی JSON را به شی جاوا اسکریپت نشان میدهد استفاده شود. با این حال دوباره و چندباره یادآوری میکنیم که هنگام استفاده از eval به دلیل خطرات امنیتی احتمالی آن محتاط باشید.
چه مرورگرهایی از تابع eval پشتیبانی میکنند؟
تابع eval در جاوا اسکریپت توسط تمام مرورگرهای وب اصلی پشتیبانی میشود، از جمله موارد زیر:
- Google Chrome (نسخه 1 و بالاتر)
- موزیلا فایرفاکس (نسخه 1 و بالاتر)
- سافاری (نسخه 1 و بالاتر)
- Opera (نسخه 3 و بالاتر)
- مایکروسافت اج (نسخه 12 و بالاتر)
- اینترنت اکسپلورر (نسخه 3 و بالاتر)
این قابلیت پشتیبانی گسترده بدان معناست که شما میتوانید از تابع eval در کد جاوا اسکریپت خود در مرورگرهای مختلف وب بدون نگرانی از سازگاری استفاده کنید.
eval در مقابل Function در جاوا اسکریپت
eval و Function دو ابزار قدرتمند در جاوا اسکریپت هستند که برای ارزیابی عبارات جاوا اسکریپت ارائه شده به عنوان رشته استفاده میشوند. در حالی که آنها هدف یکسانی را دنبال میکنند، در نحوه برخورد با عبارات متفاوت هستند.
eval در جاوا اسکریپت نوعی تابع سراسری در جاوا اسکریپت است که عبارت جاوا اسکریپت را به عنوان ک رشته میگیرد و آن را اجرا میکند. هنگام استفاده از eval در مرورگر وب، خروجی عبارت در کنسول چاپ میشود. با این حال، در محیطهایی مانند Node.js، ممکن است لازم باشد از console.log برای دیدن خروجی استفاده کنید.
مثالی با استفاده از eval:
let userInput = "2+4"; console.log(eval(userInput)); // Output: 6
Function جایگزینی برای eval است؛ مانند eval، یک عبارت جاوا اسکریپت را به عنوان رشته میگیرد اما به جای اجرای فوری آن، تابع ناشناسی را برمیگرداند که میتوانید آن را فراخوانی کنید. Function سریعتر و امنتر از eval در جاوا اسکریپت در نظر گرفته میشود. مثال زیر را در نظر بگیرید:
let userInput = "2+4"; let result = Function(userInput); console.log(result); // Output: function anonymous() { 2+4 }
در مثال بالا، Function نوعی تابع ناشناس را برمیگرداند. اگر بخواهیم نتیجه عبارت را به دست آوریم، باید عبارت return را در رشته اضافه کنیم؛ مانند مثال زیر:
let userInput = "2+4"; let result = Function("return " + userInput); console.log(result); // Output: function anonymous() { return 2+4 }
برای به دست آوردن مقدار واقعی عبارت، باید تابعی را که توسط Function برگردانده شده است، اجرا کنیم.
let userInput = "2+4"; let result = Function("return " + userInput)(); console.log(result); // Output: 6
در مثال فوق، با اجرای تابعی که توسط Function برگردانده شده است، نتیجه مورد انتظار را دریافت میکنیم.
چند نکته مهم در رابطه با تابع eval و Function
eval و Function ابزارهای قدرتمندی در جاوا اسکریپت هستند اما استفاده از آنها با خطراتی همراه است. این توابع اجازه اجرای کد دلخواه را میدهند که میتواند توسط کاربران فنی یا مخرب مورد سوءاستفاده قرار گیرد.
eval خطر خاصی را به همراه دارد زیرا این تابع کد را با همان امتیازات تماسگیرنده اجرا میکند، به این معنی که اگر برنامه شما کد را ارزیابی کند و به ویژگیهای حساسی مانند FileAPI دسترسی داشته باشد، کاربر میتواند از eval برای دسترسی به آن ویژگیها و انجام اقدامات مخرب استفاده کند.
علاوه بر این، eval در جاوا اسکریپت در مقایسه با Function کندتر است. eval مفسر جاوا اسکریپت را فراخوانی میکند که منجر به زمان اجرای طولانیتر میشود. موتورهای جاوا اسکریپت مدرن بسیاری از ساختارها را بهینه میکنند اما eval به جستجوی متغیرهای گسترده نیاز دارد که بر عملکرد تأثیر میگذارد. بهعلاوه، زمانی که از eval استفاده میشود، ممکن است مرورگر نیاز به ارزیابی مجدد کد ماشین تولید شده داشته باشد که به طور بالقوه رفتار غیرمنتظرهای مانند تغییرات نوع متغیر را معرفی میکند؛ بنابراین، استفاده از eval با احتیاط ضروری است و در صورت امکان، رویکردهای جایگزین را در نظر بگیرید.
آموزش جاوا اسکریپت از مقدماتی تا پیشرفته
تابع eval در جاوا اسکریپت برای ارزیابی رشتهای که شامل عبارات است مورد استفاده قرار میگیرد. هنگامی که پارامتر رشتهای حاوی عبارات به eval ارائه میشود، تابع مقدار آن را محاسبه میکند. اگر مقدار محاسبه شده وجود نداشته باشد، undefined برگردانده میشود. اگر پارامتر غیر رشتهای به eval ارسال شود، پارامتر را بدون هیچ تغییری به همان شکلی که هست برمیگرداند.
به طور کلی توصیه میشود از استفاده از تابع eval اجتناب کنید زیرا میتواند زمان اجرای کد را افزایش دهد و خطرات امنیتی ایجاد کند. با وجود اشکالاتی که دارد، eval میتواند برای فراخوانی توابع و کار با اشیاء جاوا اسکریپت استفاده شود، اگرچه در انجام این کار احتیاط لازم است.
اگر به دنبال یادگیری اصولی و حرفهای جاوا اسکریپت هستید و میخواهید در کمترین زمان ممکن همه اصول و قواعد آن را یاد بگیرید، باید علاوه بر برنامهریزی و تلاش، از منابع آموزشی معتبری نیز استفاده کنید تا مسیر مسلط شدن شما به این زبان کوتاهتر شود. در این رابطه پیشنهاد ما به شما استفاده از دوره آموزش صفر تا صد جاوا اسکریپت سبز لرن است. در این دوره مبتدی تا پیشرفته شما به شیوهای کاملاً عملی و علمی جاوا اسکریپت را یاد خواهید گرفت و در کنار آن از پشتیبانی اساتید دوره بهرهمند خواهید شد.
نظری برای این مقاله ثبت نشده است