Oârnatilgan eval funktsiyasi kod satrini bajarish imkonini beradi.
Sintaksis:
let result = eval(code);
Masalan:
let code = 'alert("Salom")';
eval(code); // Salom
Kod satri uzun boâlishi, satr uzilishlari, funktsiya eâlonlari, oâzgaruvchilar va boshqalarni oâz ichiga olishi mumkin.
eval natijasi oxirgi ifodaning natijasidir.
Masalan:
let value = eval("1+1");
alert(value); // 2
let value = eval("let i = 0; ++i");
alert(value); // 1
Eval qilingan kod joriy leksik muhitda bajariladi, shuning uchun u tashqi oâzgaruvchilarni koâra oladi:
let a = 1;
function f() {
let a = 2;
eval('alert(a)'); // 2
}
f();
U tashqi oâzgaruvchilarni ham oâzgartirishi mumkin:
let x = 5;
eval("x = 10");
alert(x); // 10, qiymat o'zgartirildi
Qatâiy rejimda eval oâzining leksik muhitiga ega. Shuning uchun eval ichida eâlon qilingan funktsiyalar va oâzgaruvchilar tashqarida koârinmaydi:
// eslatma: 'use strict' sukut bo'yicha ishlaydigan misollarda yoqilgan
eval("let x = 5; function f() {}");
alert(typeof x); // undefined (bunday o'zgaruvchi yo'q)
// f funktsiyasi ham ko'rinmaydi
use strict siz, eval oâzining leksik muhitiga ega emas, shuning uchun biz x va f ni tashqarida koârardik.
âevalâ dan foydalanish
Zamonaviy dasturlashda eval juda kam ishlatiladi. Koâpincha âeval yovuzâ deyiladi.
Sababi oddiy: uzoq, uzoq vaqt oldin JavaScript ancha zaif til edi, koâp narsalarni faqat eval bilan qilish mumkin edi. Lekin u vaqt oân yil oldin oâtdi.
Hozir eval dan foydalanish uchun deyarli hech qanday sabab yoâq. Agar kimdir undan foydalanayotgan boâlsa, uni zamonaviy til konstruktsiyasi yoki JavaScript Moduli bilan almashtirishi mumkin.
Uning tashqi oâzgaruvchilarga kirish qobiliyati yon taâsirga ega ekanligini unutmang.
Kod minifierlari (JS ishlab chiqarishga chiqishdan oldin uni siqish uchun ishlatiladigan vositalar) mahalliy oâzgaruvchilarni qisqaroq nomlarga (a, b va boshqalar) oâzgartirib, kodni kichikroq qiladi. Bu odatda xavfsiz, lekin eval ishlatilganda emas, chunki mahalliy oâzgaruvchilarga eval qilingan kod satridan kirish mumkin. Shuning uchun minifierlar eval dan potentsial koârinadigan barcha oâzgaruvchilar uchun bunday qayta nomlashni qilmaydi. Bu kod siqish nisbatiga salbiy taâsir qiladi.
eval ichida tashqi mahalliy oâzgaruvchilardan foydalanish ham yomon dasturlash amaliyoti deb hisoblanadi, chunki bu kodni saqlashni qiyinlashtiradi.
Bunday muammolardan butunlay xavfsiz boâlishning ikki usuli bor.
Agar eval qilingan kod tashqi oâzgaruvchilardan foydalanmasa, iltimos eval ni window.eval(...) sifatida chaqiring:
Bu usulda kod global miqyosda bajariladi:
let x = 1;
{
let x = 5;
window.eval("alert(x)"); // 1 (global o'zgaruvchi)
}
Agar eval qilingan kod mahalliy oâzgaruvchilarga muhtoj boâlsa, eval ni new Function ga oâzgartiring va ularni argumentlar sifatida oâtkazing:
let f = new Function("a", "alert(a)");
f(5); // 5
new Function konstruktsiyasi "new Function" sintaksisi boâlimida tushuntirilgan. U satrdan funktsiya yaratadi, shuningdek global miqyosda. Shuning uchun u mahalliy oâzgaruvchilarni koâra olmaydi. Lekin yuqoridagi misoldagidek ularni argumentlar sifatida aniq oâtkazish ancha aniqroq.
Xulosa
eval(code) chaqiruvi kod satrini ishga tushiradi va oxirgi ifodaning natijasini qaytaradi.
- Zamonaviy JavaScript da kam ishlatiladi, chunki odatda kerak boâlmaydi.
- Tashqi mahalliy oâzgaruvchilarga kirishi mumkin. Bu yomon amaliyot deb hisoblanadi.
- Buning oârniga, kodni global miqyosda eval qilish uchun
window.eval(code)dan foydalaning. - Yoki, agar kodingiz tashqi miqyosdan baâzi maâlumotlarga muhtoj boâlsa,
new Functiondan foydalaning va uni argumentlar sifatida oâtkazing.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)