Eval در جاوا اسکریپت – راهنمای استفاده + مثال و کد
تابع Eval در جاوا اسکریپت نوعی تابع سراسری داخلی است، به این معنی که میتوان آن را مستقیماً بدون نیاز به «شی» (Object) فراخوانی کرد. هدف این تابع ارزیابی عبارات جاوا اسکریپت یا مجموعهای از دستورات ذخیره شده در نوع دادههای «رشتهای» (استرینگ | String) است. این تابع بهویژه برای ارزیابی ورودیهای کاربر مبتنی بر رشته که عبارات جاوا اسکریپت را نشان میدهند، ابزاری مفید محسوب میشود. در این مطلب از مجله فرادرس ابتدا تابع Eval را تعریف میکنیم و با سینتکس آن آشنا میشویم. سپس به بررسی پارامترها، مقدار بازگشتی و استثناهای احتمالی آن میپردازیم و مثالهای متعددی را مرور میکنیم.در پایان نیز پشتیبانی مرورگرها از این تابع را بررسی میکنیم. پس همراه ما باشید تا با تابع Eval در زبان برنامه نویسی جاوا اسکریپت آشنا شویم.
Eval در جاوا اسکریپت چیست؟
تابع Eval در جاوا اسکریپت نوعی تابع سراسری است که رشتهای حاوی عبارت، دستور یا دنبالهای از عبارات جاوا اسکریپت را ارزیابی میکند. میتوان از آن برای ارزیابی عباراتی که به عنوان ورودی رشتهای از طرف کاربران میآید استفاده کرد. تابع Eval رشته را به عنوان آرگومان خود میگیرد. رشته میتواند حاوی هر کد جاوا اسکریپت معتبری باشد. سپس تابع Eval رشته را به عنوان کد جاوا اسکریپت ارزیابی میکند و نتیجه را بازمیگرداند.
تابع Eval میتواند برای اهداف مختلفی زیر استفاده شود:
- ارزیابی عباراتی که به عنوان ورودی رشته از کاربران میآیند.
- تولید محتوای پویا
- اشکالزدایی کد جاوا اسکریپت
همچنین توجه به این نکته هم حائز اهمیت است که تابع Eval() نوعی خطر امنیتی نیز محسوب میشود زیرا میتوان از آن برای اجرای کدهای مخرب استفاده کرد.
سینتکس Eval در جاوا اسکریپت
«سینتکس» (Syntax) استفاده از تابع Eval در Javascript بهصورت زیر است:
1eval(expression);
در کد بالا، اصطلاح expression به رشتهای اشاره دارد که عبارتی واحد یا دنبالهای از عبارات را در برمیگیرد. به عنوان مثال، عبارت میتواند به شکل "4 + 11" یا حتی چیزی شبیه پیام ساده "Hello" باشد.
پارامترهای تابع Eval در Javascript
تابع Eval در جاوا اسکریپت پارامتری واحد میگیرد که این پارامتر رشتهای است شامل عبارت، دستور یا دنبالهای از عبارات جاوا اسکریپت. عبارت یا دستور میتواند شامل متغیرها، توابع یا حتی اشیای جاوا اسکریپت باشد. به عنوان مثال، کد زیر عبارت "1 + 2" را ارزیابی میکند:
1const result = eval("1 + 2");
کد زیر عبارت console.log ("Hello, world!") را ارزیابی و اجرا میکند.
1eval("console.log('Hello, world!');");
کد زیر دنبالهای از عبارات را ارزیابی میکند.
1eval("var x = 1; x++;");
مقدار بازگشتی Eval در Javascript
با استفاده از مقدار رشته به عنوان آرگومان، تابع Eval در جاوا اسکریپت مقدار بازگشتی مربوط به نتیجه ارزیابی کد ارائه شده را بازمیگرداند. از طرفی دیگر اگر هیچ مقدار قطعی از فرآیند ارزیابی ظاهر نشود، تابع Eval() مقدار «تعریفنشده» ( Undifiend ) را بازمیگرداند. به عنوان مثال، کد زیر عبارت "1 + 2" را ارزیابی میکند و مقدار 3 را در خروجی نمایش میدهد:
1const result = eval("1 + 2");
کد زیر عبارت console.log ("Hello, world!") را اجرا میکند. اما هیچ مقداری را برنمیگرداند:
1eval("console.log('Hello, world!');");
کد زیر دنبالهای از عبارات var x = 1 را ارزیابی میکند و مقدار x را بازمیگرداند که 2 است:
1eval("var x = 1; x++;");
استثناهای Eval در زبان جاوا اسکریپت
هنگامی که برای تابع Eval در زبان برنامه نویسی جاوا اسکریپت از آرگومانهای غیر رشتهای استفاده شود، رفتارهای خاصی از خود نشان میدهد. در چنین مواردی، تابع اساساً همان آرگومان دریافتی خود را بازمیگرداند.
مثال زیر برای بیان مفهوم استفاده از آرگومانهای غیر رشتهای برای تابع Eval در زبان جاوا اسکریپت است:
1let arr = [1, 2, 3];
2// Utilizing the eval() function
3let output = eval(arr);
4// Displaying the resulting output
5console.log(output);
خروجی کد بالا به صورت زیر است:
[1, 2, 3]
در سناریوی بالا، آرایهای به عنوان آرگومان برای تابع Eval() ارائه شده است. از آنجا که آرگومان ارائه شده از نوع داده رشته نیست، تابع به طور مشخص آرایه اصلی را بدون هیچ تغییری بازمیگرداند. توجه به مثال زیر هم برای بیان این موضوع اهمیت زیادی دارد و قطعه کد آن به صورت زیر است:
1var a = 3;
2
3var multiply_str;
4var output;
5
6// writing a string that multiplies 2 variables
7multiply_str = "a * 7";
8
9// using the eval() function
10output = eval(multiply_str);
11
12// printing the result
13console.log(output);
خروجی کد بالا به صورت زیر است:
21
در سناریوی بالا، رشتهای برای نمایش ضرب دو متغیر ساخته شده است. یعنی مقدار ذخیره شده در متغیر "a" و عدد 7 . با استفاده از تابع Eval() ، این عبارت رشته ارزیابی خواهد شد. در نتیجه، تابع عملیات را که ضرب دو عدد است اجرا میکند. نتیجه این عمل متعاقباً به متغیر output اختصاص داده شده و از طریق کنسول نمایش داده میشود.
Eval در جاوا اسکریپت چگونه کار می کند؟
عملیات اصلی تابع Eval در زبان برنامه نویسی جاوا اسکریپت شامل دریافت آرگومان مبتنی بر رشته است. اگر این رشته شامل عبارت باشد، تابع Eval به ارزیابی و محاسبه عبارت میپردازد. برعکس، اگر رشته شامل دستور باشد، تابع ارزیابی عبارت را انجام میدهد. علیرغم کاربرد بالقوه تابع Eval، به طور کلی توصیه میشود که در به کار بردن آن احتیاط رعایت شود و استفاده از آن به حداقل برسد. در ادامه دلیل اینکه چرا باید در استفاده از این تابع جاوا اسکریپت احتیاط شود آورده شده است.
٣ دلیل عمده برای عدم استفاده از این تابع به صورت موارد زیر هستند:
- سرعت اجرا: سرعت اجرای تابع Eval() به دلیل فعالسازی مفسر جاوا اسکریپت به طور قابلتوجهی کند است. این تابع میتواند در عملکرد برنامه تأثیر بگذارد و منجر به کاهش سرعت اجرای برنامه شود.
- آسیبپذیریهای امنیتی: وقتی تابع Eval() آرگومان رشتهای را پردازش میکند که کد مخرب را در خود نگه میدارد، دری را برای حملات احتمالی بدافزار به سیستم یا سرور برنامه نویس باز میکند. این نوعی خطر امنیتی بسیار قابلتوجه است که باید کاربران به آن توجه کنند.
- کاهش خوانایی کد: گنجاندن تابع Eval() در کد کاربر میتواند منجر به کاهش خوانایی کد شود. این تابع خودبهخود میتواند پیچیدگی کد را افزایش دهد، جریان منطقی کد را مبهم کرده و درک و نگهداری آن را چالشبرانگیزتر کند.
با توجه به این اشکالات ذاتی در استفاده از تابع مذکور، توصیه میشود بهجای استفاده از تابع Eval در جاوا اسکریپت، احتیاط به خرج داده و رویکردهای جایگزین مورد استفاده قرار بگیرند.
مثال هایی از تابع Eval
در این بخش چند مثال آورده شده که نشان دهنده استفاده از تابع Eval در جاوا اسکریپت هستند و هدف آنها ارائه درک جامعی از موضوع است.
مثال ۱: استفاده از تابع Eval برای فراخوانی تابع
مثال زیر را در نظر بگیرید.
1// defining a function
2function mean(a, b) {
3 return (a + b) / 2;
4}
5
6// creating a variable to store the result
7let ans;
8
9// using the eval() function
10ans = eval("mean(20, 13)");
11
12// displaying the result
13console.log(ans);
خروجی مثال بالا به صورت زیر است:
16.5
در مثال فوق، تابعی با دو آرگومان با استفاده از رشتهای در داخل تابع Eval() کپسوله شده است. مقدار حاصل از Eval() در متغیر ans ذخیره شده و متعاقباً در کنسول چاپ میشود.
مثال۲: کاربرد تابع Eval با دستورات جاوا اسکریپت
در ادامه این مطلب از مجله فرادرس، مثال دیگری از کاربرد Eval() با دستورات جاوا اسکریپت را ارائه میکنیم.
1// creating variables
2let time = 7;
3let statement_str;
4
5// writing the if else conditional inside a string
6statement_str = "if(time >= 6 && time <= 10) {'Time to wake up!';} else {'You are late.';}"
7
8// displaying the output
9console.log(eval(statement_str));
خروجی مثال فوق هم به صورت زیر است:
1Time to wake up!
در مثال بالا، نوعی دستور شرطی در رشته فرموله میشود. سپس رشته به عنوان آرگومان برای تابع Eval() ارائه خواهد شد. از آنجا که متغیر "time" دارای مقدار 7 است، خروجی "Time to wake up!" تولید میشود.
مثال ۳
در مثال سوم، اعمال Eval() به آرگومان شی رشته بررسی شده است.
1// creating a variable and using eval() function
2let output = eval(new String("4 + 11"));
3
4// displaying the output
5console.log(output);
خروجی مثال بالا به صورت زیر است:
"4 + 11"
در مثال بالا، شی رشته به عنوان آرگومان برای تابع Eval() ارائه شده است. شی رشته حاوی متن "4 + 11" است. درنتیجه ارسال شی رشته، تابع Eval() از ارزیابی محتوا خودداری میکند و آرگومان اصلی را بدون تغییر بازمیگرداند. در نتیجه، خروجی "4 + 11" را بهجای مقدار محاسبه شده، یعنی 15 نشان میدهد.
مثال ٤ - استفاده از Eval() با شی «جیسون» (JSON)
1// creating a variable
2let object_str;
3
4// creating an object string
5object_str = "({'Company': 'Google', 'Profile': ['Backend Dev.', 'Software Dev.'], 'Salary': [100000, 120000]})";
6
7// using the eval() function to convert the string to a JS object
8const job_desc = eval(object_str);
9
10// displaying the result
11console.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 نوعی نمایش رشتهای شبیه شی JSON دارد. با استفاده از تابع Eval() ، رشته به نوعی شی جاوا اسکریپت واقعی تبدیل شده و سپس در متغیر job_desc ذخیره میشود. در نتیجه، ویژگیهای شی مانند «job_desc.Company»، «job_desc.Profile» و غیره میتوانند برای تولید خروجی معنیدار مورد استفاده قرار گیرند.
تابع Eval در چه مرورگرهایی پشتیبانی می شود؟
تابع Eval در بسیاری از مرورگرهای وب امروزی پشتیبانی میشود که از مهمترین آنها میتوان به کروم و مایکروسافت اج اشاره کرد. سایر مرورگرها در فهرست زیر آورده شده است:
- موزیلا فایرفاکس (نسخه ١ و نسخههای بعدی)
- سافاری (نسخه ١ و نسخههای بعدی)
- اوپرا (نسخه ٣ و نسخههای بعدی)
- اینترنت اکسپلورر (نسخه ٣ و نسخههای بعدی)
سخن پایانی
تابع Eval در جاوا اسکریپت برای ارزیابی رشته ارائه شده حاوی عبارت یا دستور عمل میکند. هنگامی که رشتهای حاوی عبارت یا دستور به آن داده میشود، مقدار حاصل را محاسبه کرده و نتیجه را بازمیگرداند. اگر مقداری تعیین نشود، خروجی تابع تعریف نشده خواهد بود. همچنین هنگامی که از آرگومان غیر رشتهای در آن استفاده شود، تابع Eval() آرگومان را بدون تغییر بازمیگرداند.
به طور کلی توصیه میشود که از این تابع به دلیل پتانسیل اجرای کند و آسیبپذیریهای امنیتی در برنامههای کاربردی کمتر استفاده شود. با وجود این اشکالات، Eval() میتواند برای فراخوانی توابع و تعامل با Object در جاوا اسکریپت در برخی از سناریوها مفید واقع شود. در مطلب فوق از مجله فرادرس اطلاعات نسبتاً مطلوبی از تابع Eval در جاوا اسکریپت شامل سینتکس، نحوه استفاده، پارامترهای آن، مقدار بازگشتی و دلایل عدم استفاده از آن ارائه شد. به امید اینکه مطلب فوق مورد رضایت کاربران عزیز قرار گرفته باشد.