Dalam JavaScript, anda boleh menggunakan fungsi eval() untuk menghuraikan kod JavaScript dalam rentetan dan mengembalikan hasil pelaksanaan kod yang sepadan:
Pada asasnya, eval() ialah fungsi objek global JavaScript. Sebagai contoh, kod di atas adalah bersamaan dengan:
Walau bagaimanapun, apabila menggunakan pernyataan eval(), kaedah pertama di atas biasanya diterima pakai, iaitu, mengabaikan objek global dan menggunakan eval() secara langsung.
Penggunaan eval()
Atas dua sebab berikut, anda harus cuba mengelak daripada menggunakan pernyataan eval() dalam kod anda melainkan ia benar-benar perlu:
1. Secara logiknya, rentetan harus digunakan untuk menyimpan kandungan dan maklumat semasa program berjalan, dan tidak boleh digunakan untuk menyimpan logik pengiraan tertentu.
2. Memandangkan parameter eval() ialah rentetan dan rentetan tidak boleh diproses secara leksikal, penterjemah JavaScript tidak boleh mengoptimumkan pernyataan panggilan eval().
Nilai pulangan eval()
Nilai pulangan eval() mengikut peraturan berikut:
1 Jika parameter eval() bukan rentetan, maka eval() akan mengembalikan parameter secara langsung.
2. Jika parameter eval() ialah rentetan, maka eval() menghuraikan rentetan menjadi kod dan melaksanakannya, dan mengembalikan hasil baris terakhir pelaksanaan kod.
3. Jika rentetan tidak boleh dihuraikan ke dalam kod undang-undang, eval() akan membuang SyntaxError.
4. Jika rentetan itu boleh dihuraikan ke dalam kod undang-undang, tetapi ralat dilaporkan semasa pelaksanaan kod ini, maka ralat akan dilaporkan kepada pernyataan eval() dan dilemparkan oleh eval().
console.log(eval("42 */ 2"));//SyntaxError
console.log(eval("42 * 2; 22 * 3;"));//66 eval mengembalikan hasil ungkapan/penyataan terakhir
console.log(eval("null.toString()"));//TypeError, pengecualian dalam kod eval-ed akan disebarkan di luar eval().
Persekitaran boleh ubah
Eval() dalam JavaScript mempunyai ciri penting: kod dalam rentetan parameter eval() boleh mengakses pembolehubah dalam kod luaran, dan juga boleh mendedahkan pembolehubah yang baru dibuat dalam kod rentetan parameter kepada kod luaran. Iaitu, jika rentetan parameter eval() boleh dihuraikan secara sah, maka JS akan menggantikan kod yang dihuraikan dengan baris di mana eval() terletak:
Perlu diingat bahawa prasyarat untuk merealisasikan ciri di atas ialah kod dalam rentetan parameter eval() boleh dihuraikan secara sah. Sebagai tambahan kepada sintaks kod yang betul, JS juga memerlukan kod dalam rentetan parameter eval() mestilah "berisi sendiri": kod tersebut mestilah bermakna hanya setakat kod dalam rentetan parameter berkenaan. Sebagai contoh, anda tidak boleh menghantar rentetan seperti "kembali;" ke fungsi eval():
Jika fungsi eval() digunakan secara langsung, pembolehubah yang diakses oleh kod dalam rentetan parameter eval() ialah pembolehubah fungsi di mana pernyataan eval() terletak, iaitu persekitaran pembolehubah yang digunakan oleh eval() fungsi ialah "persekitaran pembolehubah tempatan" . Jika anda tidak menggunakan fungsi eval() secara langsung, tetapi gunakan pembolehubah baharu yang turut menunjuk ke fungsi eval(), maka pembolehubah yang diakses oleh kod dalam rentetan parameter yang sepadan ialah pembolehubah global, iaitu pembolehubah yang digunakan oleh fungsi eval() Persekitaran ialah "persekitaran berubah global":
Walau bagaimanapun, perlu diperhatikan bahawa tingkah laku dalam IE6, 7, dan 8 adalah berbeza daripada ini. Dalam IE6, 7, dan 8, walaupun fungsi eval() dinamakan semula, "persekitaran pembolehubah setempat" masih digunakan.