Artikel ini menganalisis penggunaan fungsi eval dalam JavaScript dengan contoh. Kongsikan dengan semua orang untuk rujukan anda. Analisis khusus adalah seperti berikut:
eval() hanya mempunyai satu parameter Jika parameter yang dihantar bukan rentetan, parameter ini akan dikembalikan secara langsung. Jika tidak, rentetan akan disusun sebagai kod js Jika kompilasi gagal, ralat sintaks (SyntaxError) akan dilemparkan. Jika kompilasi berjaya, kod akan dilaksanakan dan nilai ungkapan atau pernyataan terakhir dalam rentetan akan dikembalikan jika ungkapan atau pernyataan terakhir tidak mempunyai nilai, undefined akan dikembalikan. Jika rentetan melemparkan pengecualian, pengecualian akan menghantar panggilan ke eval();
Perkara yang paling penting tentangeval() ialah ia menggunakan persekitaran skop pembolehubah di mana ia dipanggil, iaitu, operasi mencari nilai pembolehubah dan mentakrifkan pembolehubah dan fungsi baharu adalah sama persis dengan kod dalam skop tempatan.
eval("var x = 100"); eval("var y = 11"); console.log(x * y); //x * y == 1100 eval("function foo(x){return Math.pow(x,x);}"); console.log(foo(5)); // 25
Konteks di mana rentetan eval dilaksanakan adalah sama dengan konteks di mana fungsi dipanggil, yang tidak membenarkan ia dijalankan sebagai sebahagian daripada fungsi:
var foo = function(a){ eval(a); }; foo("return;");
Oleh kerana konteks di mana eval(a) dilaksanakan dalam kod di atas adalah global, menggunakan return dalam konteks global akan menimbulkan ralat sintaks: return not in function.
eval() mempunyai keupayaan untuk mengubah suai pembolehubah tempatan, yang merupakan masalah besar untuk pengoptimum js. Untuk memudahkan pelaksanaan jurubahasa js, piawaian ECMAScript3 menetapkan bahawa mana-mana jurubahasa tidak dibenarkan untuk menetapkan alias kepada eval() Jika fungsi eval() dipanggil melalui alias, pengecualian EvalError akan dibuang.
Malah, kebanyakan pelaksanaan tidak seperti ini. Apabila dipanggil melalui alias, eval() akan melaksanakan rentetannya sebagai kod global peringkat atas. Melaksanakan kod mungkin mentakrifkan pembolehubah global baharu dan fungsi global, atau memberikan nilai kepada pembolehubah global, tetapi ia tidak boleh menggunakan atau mengubah suai pembolehubah tempatan dalam fungsi panggilan utama, jadi ia tidak akan menjejaskan pengoptimuman kod dalam fungsi.
Dalam ECMAScript5, sikapnya berbeza: ia menentang membuang pengecualian EvalError. Dalam ECMAScript5, apabila fungsi eval() dipanggil terus menggunakan nama yang tidak layak, ia biasanya dipanggil "direct eval (direct eval)" apabila eval() dipanggil terus, ia sentiasa dilaksanakan dalam skop konteks di mana ia berada dipanggil. Panggilan tidak langsung lain menggunakan objek global sebagai skop konteksnya dan tidak boleh membaca, menulis dan mentakrifkan pembolehubah dan fungsi setempat. (Tetapi sebenarnya saya dapati dalam ujian pepijat api bahawa pembolehubah global telah diubah suai :( )
Terdapat sangat sedikit senario di mana eval sebenar diperlukan untuk melaksanakan segmen kod boleh digunakan lebih kerap daripada eval tempatan.
Versi awal IE sebelum IE9 bukan eval global apabila memanggil eval() melalui alias, tetapi IE mentakrifkan fungsi global execScript() untuk melengkapkan fungsi eval global (eval teras tunggal() sedikit berbeza, execScript () sentiasa mengembalikan null).
Mod ketat ECMAScript5 mengenakan lebih banyak sekatan ke atas tingkah laku fungsi eval. Apabila melaksanakan kod menggunakan eval atau eval dalam mod ketat bermula dengan arahan "gunakan ketat", eval ialah eval tempatan dalam konteks peribadi Selain itu, mod ketat menyenaraikan eval sebagai perkataan terpelihara, yang menjadikan eval() lebih seperti operator . Fungsi eval() tidak boleh diganti dengan alias, dan nama pembolehubah, nama fungsi, parameter fungsi atau parameter tangkapan pengecualian tidak boleh dinamakan "eval".
Saya harap artikel ini akan membantu reka bentuk pengaturcaraan JavaScript semua orang.