Rumah  >  Artikel  >  hujung hadapan web  >  Adakah `eval()` dan `new Function()` Benar-benar Boleh Ditukar Dalam JavaScript?

Adakah `eval()` dan `new Function()` Benar-benar Boleh Ditukar Dalam JavaScript?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 11:01:02142semak imbas

Are `eval()` and `new Function()` Truly Interchangeable in JavaScript?

Menyelidiki Perbezaan: Adakah eval() dan Function() baharu Boleh Ditukar dalam JavaScript?

Selalunya dalam JavaScript, kita menghadapi fungsi seperti eval() dan Fungsi baharu(). Walaupun sintaks mereka mungkin kelihatan serupa pada pandangan pertama, pemeriksaan lebih dekat mendedahkan perbezaan asas dalam tingkah laku mereka.

Pertimbangkan fungsi pernyataan tunggal berikut:

var evaluate = function(string) {
    return eval('(' + string + ')');
}

var func = function(string) {
    return (new Function( 'return (' + string + ')' )());
}

console.log(evaluate('2 + 1'));
console.log(func('2 + 1'));

Adakah kedua-dua fungsi ini sama dalam operasinya ? Bertentangan dengan kepercayaan popular, mereka tidak.

eval() lwn. new Function()

  • eval(): Mentafsir rentetan sebagai ungkapan JavaScript dalam skop pelaksanaan semasa. Ia mempunyai keupayaan untuk mengakses pembolehubah setempat.
  • Fungsi baharu(): Membina objek fungsi daripada rentetan yang mengandungi kod JavaScript. Fungsi ini berjalan dalam skop yang berasingan, mengasingkannya daripada pembolehubah setempat.

Untuk menggambarkan perbezaan ini, pertimbangkan fungsi berikut:

function test1() {
    var a = 11;
    eval('(a = 22)');
    alert(a);            // alerts 22
}

Dalam contoh ini, eval() mengubah suai pembolehubah tempatan 'a' dalam fungsi test1(), menghasilkan amaran sebanyak 22. Walau bagaimanapun, jika kita menggunakan Function('return (a = 22);')(), pembolehubah tempatan 'a' akan kekal tidak berubah.

Implikasi dan Awas

Walaupun kedua-dua eval() dan Function() baharu memenuhi tujuannya, adalah penting untuk ambil perhatian bahawa eval() membawa keselamatan yang wujud risiko. Keupayaannya untuk mengakses pembolehubah tempatan dan berpotensi mengubah suai skop global boleh membawa kepada akibat yang tidak diingini.

Akibatnya, secara amnya dinasihatkan untuk mengelak daripada menggunakan eval() melainkan benar-benar perlu. Data tidak dipercayai yang dihantar ke eval() boleh menjejaskan keselamatan aplikasi anda. Begitu juga, Function() baharu harus digunakan dengan berhati-hati apabila mengendalikan input yang tidak dipercayai.

Atas ialah kandungan terperinci Adakah `eval()` dan `new Function()` Benar-benar Boleh Ditukar Dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn