Fungsi eval sebenarnya sangat sederhana, yaitu meneruskan string ke interpreter JS, dan interpreter Javascript akan menafsirkan string tersebut ke dalam kode Javascript dan mengeksekusinya.
Ambil contoh paling sederhana:
Copy kode kodenya sebagai berikut:
<skrip tipe="teks/javascript">
eval("peringatan(1+1)");
skrip>
Ini sangat sederhana, tafsirkan string ke dalam kode JS dan jalankan, dan 2 akan muncul.
Tentu saja, contoh di atas hanyalah mainan, dan tidak ada orang yang cukup bodoh untuk menggunakannya dalam praktik. Menurut saya cara paling dasar untuk menggunakan fungsi eval adalah di DOM. Misalnya, jika kita memiliki div1, div2, dan div3, maka tidak ada cara untuk mendapatkan ID kita saat menggunakan document.getElementByID gunakan dalam loop for. Gunakan eval untuk menyambung program seperti itu. Misalnya:
Copy kode kodenya sebagai berikut:
<skrip tipe="teks/javascript">
untuk (var putaran = 1; putaran < 10; putaran++) {
eval('document.getElementById("div"+loop).innerHTML="123"');
}
skrip>
Setelah membicarakan kegunaan paling dasar, saya yakin semua orang masih tertarik dengan fungsi ini. Jika fungsi ini hanya memiliki kegunaan yang sedikit, akan terlalu membosankan. Lalu mari kita lihat fungsi eval() sedikit demi sedikit.
Mari kita mulai dengan cakupan eval dan melihat fungsi ini:
Copy kode kodenya sebagai berikut:
<skrip tipe="teks/javascript">
eval("var i=3");
peringatan(i);
skrip>
Kodenya sangat sederhana, dan hasilnya bisa muncul 3. Selanjutnya, bandingkan kode ini:
Copy kode kodenya sebagai berikut:
<skrip tipe="teks/javascript">
var tes = fungsi () {
eval("var i=3");
peringatan(i);
}
tes();
peringatan(i);
skrip>
Hasilnya muncul 3 terlebih dahulu, lalu tidak terdefinisi.
Jadi jelaskan: kode yang dieksekusi secara dinamis oleh fungsi eval() tidak membuat cakupan baru, dan kodenya dieksekusi dalam cakupan saat ini. Jadi dengan kata lain, fungsi eval() juga bisa menggunakan this, argumen, dan objek lain dalam cakupan saat ini.
Di IE, fungsi yang sangat mirip dengan eval() didukung: execScript(). Kita dapat menulis kode sederhana.
Copy kode kodenya sebagai berikut:
<skrip tipe="teks/javascript">
var tes = fungsi () {
execScript("var i=3");
peringatan(i);
}
tes();
peringatan(i);
skrip>
Hasilnya, dua angka 3 muncul. Ini juga menunjukkan karakteristik fungsi execScript. Pertama-tama, ini mirip dengan eval. Ia dapat menafsirkan string ke dalam kode JS dan menjalankannya, tetapi cakupannya bukan cakupan saat ini ruang lingkup global. Saat kami mencoba kode di atas pada Firefox dan Google Chrome: kami menemukan bahwa kode pada execScript tidak valid di Firefox, yang juga menggambarkan adanya masalah dengan kompatibilitas browser terhadap kode execScript.
Lalu muncul pertanyaan, bagaimana kita bisa menyatukan “kelebihan” dari kedua fungsi ini, yaitu kompatibilitas global + browser. Saya mencari secara online dan merangkumnya sendiri, yang mungkin seperti ini:
Copy kode kodenya sebagai berikut:
<skrip tipe="teks/javascript">
var StrongEval = fungsi (kode) {
if (window.navigator.userAgent.indexOf("MSIE") >= 1) {
execScript(kode);
}
if (window.navigator.userAgent.indexOf("Firefox") >= 1) {
window.eval(kode);
}
kalau tidak {
execScript(kode);
}
};
var Tes = fungsi () {
StrongEval("var i=3");
}
Tes();
peringatan(i);
skrip>
Dengan cara ini, ini bisa sangat kompatibel dengan FF dan IE. Kode pentingnya adalah eval dan window.eval tidak setara di FF.
Selain itu, kita juga dapat menggunakan eval+with untuk mencapai beberapa trik aneh.
Secara umum kita dapat menulis kode seperti ini:
Copy kode kodenya sebagai berikut:
var objek = fungsi () {
ini.a = 1;
ini.b = 2;
ini.c = 5;
ini.kesenangan = fungsi() {
ini.c = ini.a + ini.b;
}
};
var o = objek baru();
o.menyenangkan();
peringatan(oc);
Atau ini:
Copy kode kodenya sebagai berikut:
var objek = {
sebuah: 1,
b: 2,
c: 5,
menyenangkan: fungsi () {
ini.c = ini.a + ini.b;
}
}
Atau ini:
Copy kode kodenya sebagai berikut:
var objek = fungsi () {
ini.a = 1;
ini.b = 2;
ini.c = 5;
};
obj.prototipe.kesenangan = fungsi () {
ini.c = ini.a + ini.b;
}
var o = objek baru();
o.menyenangkan();
peringatan(oc);
Tidak peduli apa, apakah kamu bosan dengan perasaan ini? Maka marilah kita mengambil pendekatan yang sangat berbeda, sehingga setidaknya bisa lebih nyaman bagi indra.
Copy kode kodenya sebagai berikut:
<skrip tipe="teks/javascript">
var funtemp = fungsi () {
c = a + b;
}
var objek = {
sebuah: 1,
b: 2,
c: 5
};
sangat menyenangkan;
dengan (obj) {
eval("menyenangkan = " + funtemp);
}
seru();
peringatan(obj.c);
skrip>
Yang ini sangat dipaksakan dan bagus sekali. Kami tidak akan membahas apakah terlihat nyaman atau tidak. Mari kita bahas situasi seperti ini.
Copy kode kodenya sebagai berikut:
<skrip>
varDBCommon = fungsi () {
peringatan("1."); BuatKoneksi();
peringatan("2."); OpenConnection();
peringatan("3.");
peringatan("4.");
peringatan("5.");
}
var SQLServerUmum = {
CreateConnection: function() { alert("Buat koneksi SQL Server" },
OpenConnection: function() { alert("Buka koneksi SQL Server");
CreateCommand: function() { alert("Buat perintah SQL Server" },
ExcuteCommand: function() { alert("Jalankan perintah DSQL Server" },
CloseConnection: function() { alert("Tutup koneksi SQL Server");
};
var OracleUmum = {
CreateConnection: function() { alert("Buat ¢Koneksi Oracle" },
OpenConnection: function() { alert("Buka koneksi Oracle" },
CreateCommand: function() { alert("Buat perintah Oracle" },
ExcuteCommand: function() { alert("Jalankan perintah DOracle" },
CloseConnection: function() { alert("Tutup?Koneksi Oracle");
};
dengan (SQLServerCommon) {
eval("untukSQLServer=" + DBCommon);
}
dengan (OracleCommon) {
eval("untukOracle=" + DBCommon);
}
untukSQLServer();
untukOracle();
skrip>
Bisakah kita menganggap ini sebagai pola metode templat sederhana? hehe. Kita juga dapat menyebutnya menggunakan eval dan with untuk mengubah konteks suatu fungsi.
Namun sekali lagi, Eval jarang digunakan dalam situasi umum, dan kita dapat sepenuhnya menghindari penggunaannya.