Dalam JavaScript, Anda dapat menggunakan fungsi eval () untuk menguraikan kode JavaScript dalam string dan mengembalikan hasil eksekusi kode yang sesuai:
Salinan kode adalah sebagai berikut:
console.log (eval ("42 * 2")); // 84
Eval () pada dasarnya adalah fungsi dari objek global JavaScript. Misalnya, kode di atas setara dengan:
Salinan kode adalah sebagai berikut:
console.log (this.eval ("42 * 2")); // 84
Namun, ketika menggunakan pernyataan eval (), metode pertama yang disebutkan di atas umumnya diadopsi, yaitu, abaikan objek global dan gunakan eval () secara langsung.
Penggunaan eval ()
Untuk dua alasan berikut, kecuali Anda benar -benar membutuhkannya, Anda harus mencoba menghindari menggunakan pernyataan eval () dalam kode Anda:
1. Secara logis, string harus digunakan untuk menyimpan konten dan informasi selama operasi program, daripada menyimpan logika perhitungan tertentu.
2. Karena parameter eval () adalah string, dan tidak dapat menjadi leksikal untuk sepotong string, juru bahasa JavaScript tidak dapat mengoptimalkan untuk pernyataan panggilan eval ().
nilai pengembalian eval ()
Nilai pengembalian eval () mengikuti aturan berikut:
1. Jika parameter eval () bukan string, eval () akan secara langsung mengembalikan parameter.
2. Jika parameter eval () adalah string, maka eval () parsing string ke dalam kode dan menjalankannya, dan mengembalikan hasil dari baris terakhir eksekusi kode.
3. Jika string tidak dapat diuraikan ke dalam kode yang sah, eval () akan melempar kesalahan sintakser.
4. Jika suatu string dapat diuraikan ke dalam kode hukum, tetapi kesalahan dilaporkan selama pelaksanaan kode ini, maka kesalahan akan dilaporkan ke pernyataan eval () dan dilemparkan oleh eval ().
Salinan kode adalah sebagai berikut:
Console.log (eval ([1,2,3])); // [1, 2, 3]
console.log (typeof eval ([1,2,3])); // objek
console.log (eval ("42 */2")); // sintakserror
console.log (eval ("42 * 2; 22 * 3;")); // 66. eval mengembalikan hasil ekspresi/pernyataan terakhir
console.log (eval ("null.tostring ()")); // typeError, pengecualian dalam kode evaluasi akan disebarkan di luar eval ().
lingkungan variabel
Eval () dalam JavaScript memiliki fitur penting: kode dalam string parameter eval () dapat mengakses variabel dalam kode eksternal, dan juga dapat mengekspos variabel yang baru dibuat dalam kode string parameter ke kode eksternal. Yaitu, jika string parameter eval () dapat diuraikan secara hukum, JS akan menggantikan kode parsed dengan garis di mana eval () berada: berada: berada: berada:
Salinan kode adalah sebagai berikut:
// Lingkungan Variabel
var a = 108;
console.log (eval ("fungsi ganda (x) {return x*2;} a = double (a)"));
Console.log (a); // 216
console.log (ganda (33)); // 66
Perlu dicatat bahwa prasyarat untuk mengimplementasikan fitur di atas adalah bahwa kode dalam string parameter eval () dapat diuraikan secara hukum. Selain sintaks kode yang benar, JS juga mensyaratkan bahwa kode dalam string parameter eval () harus "diatur sendiri": kode tersebut harus masuk akal hanya dalam hal kode dalam string parameter. Misalnya, tidak mungkin untuk melewati string seperti "kembali;" ke fungsi eval ():
Salinan kode adalah sebagai berikut:
function test () {
var s = "tes";
eval ("return s;");
}
test (); // sintakserror: return not in function
Jika Anda menggunakan fungsi eval () secara langsung, variabel yang diakses oleh kode dalam string parameter eval () adalah variabel -variabel tersebut dalam fungsi di mana pernyataan eval () berada, yaitu, lingkungan variabel yang digunakan oleh fungsi eval () adalah "lingkungan variabel lokal". Jika Anda tidak menggunakan fungsi eval () secara langsung, tetapi gunakan variabel baru yang juga menunjuk ke fungsi eval (), maka variabel yang diakses oleh kode dalam string parameter yang sesuai adalah variabel global, yaitu, lingkungan variabel yang digunakan oleh fungsi eval () adalah "lingkungan variabel global" ":
Salinan kode adalah sebagai berikut:
// Lingkungan Variabel Lokal dan Lingkungan Variabel Global
var berganti nama = evaluasi;
var x = "asal", y = "asal";
fungsi f () {
var x = "baru";
eval ("x += 'diubah';");
mengembalikan x;
}
fungsi g () {
var y = "baru";
berganti nama ("y += 'diubah';");
mengembalikan y;
}
console.log (f (), x); // asal mula baru
console.log (g (), y); // originchanged baru
Namun, perlu dicatat bahwa perilaku dalam IE6, 7, dan 8 berbeda. Dalam IE6, 7, dan 8, bahkan jika fungsi eval () diganti namanya, "lingkungan variabel lokal" masih digunakan.