Apakah kedua fungsi ini melakukan hal yang sama di balik layar? (dalam fungsi pernyataan tunggal)
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'));
javascript
function
optimization
eval
qwertymk.dll
sumber
sumber
new
dipertimbangkan dalam diskusi ini?Function
secara implisit memberi contoh afunction object
. Mengecualikannew
tidak akan mengubah kode sama sekali. Berikut ini adalah jsfiddle yang menunjukkan bahwa: jsfiddle.net/PcfG8Jawaban:
Tidak, mereka tidak sama.
eval()
mengevaluasi string sebagai ekspresi JavaScript dalam cakupan eksekusi saat ini dan dapat mengakses variabel lokal.new Function()
mengurai kode JavaScript yang disimpan dalam string menjadi objek fungsi, yang kemudian dapat dipanggil. Itu tidak dapat mengakses variabel lokal karena kode berjalan dalam lingkup terpisah.Pertimbangkan kode ini:
function test1() { var a = 11; eval('(a = 22)'); alert(a); // alerts 22 }
Jika
new Function('return (a = 22);')()
digunakan, variabel lokala
akan mempertahankan nilainya. Namun demikian, beberapa programmer JavaScript seperti Douglas Crockford percaya bahwa keduanya tidak boleh digunakan kecuali benar-benar diperlukan , dan menghindari / menggunakanFunction
konstruktor pada data yang tidak tepercaya adalah tidak aman dan tidak bijaksana.sumber
new Function(code)
sama denganeval('(function(){'+code+'})()')
atau apakah ini konteks eksekusi yang sama sekali baru?eval('(function(){'+code+'})')
, yang akan mengembalikan objek fungsi. Menurut MDN , "Fungsi yang dibuat dengan konstruktor Fungsi tidak membuat penutupan untuk konteks pembuatannya; mereka selalu berjalan dalam konteks jendela (kecuali badan fungsi dimulai dengan pernyataan" gunakan ketat "; dalam hal ini konteksnya tidak ditentukan) . "Tidak.
Dalam pembaruan Anda, panggilan ke
evaluate
danfunc
menghasilkan hasil yang sama. Tapi, mereka pasti tidak "melakukan hal yang sama di belakang layar". Thefunc
Fungsi menciptakan fungsi baru, tapi kemudian segera mengeksekusinya, sedangkanevaluate
fungsi hanya mengeksekusi kode di tempat.Dari pertanyaan awal:
var evaluate = function(string) { return eval(string); } var func = function(string) { return (new Function( 'return (' + string + ')' )()); }
Ini akan memberi Anda hasil yang sangat berbeda:
evaluate('0) + (4'); func('0) + (4');
sumber
return eval('(' + string + ')');
maka mereka akan menghasilkan hasil yang sama.new Function
menciptakan fungsi yang dapat digunakan kembali.eval
hanya mengeksekusi string yang diberikan dan mengembalikan hasil dari pernyataan terakhir. Pertanyaan Anda keliru saat Anda mencoba membuat fungsi pembungkus yang menggunakan Fungsi untuk meniru eval.Benarkah mereka berbagi beberapa kode di balik tirai? Ya, sangat mungkin. Kode yang persis sama? Tidak, tentu.
Untuk bersenang-senang, inilah implementasi saya yang tidak sempurna menggunakan eval untuk membuat fungsi. Semoga ini menjelaskan perbedaannya!
function makeFunction() { var params = []; for (var i = 0; i < arguments.length - 1; i++) { params.push(arguments[i]); } var code = arguments[arguments.length - 1]; // Creates the anonymous function to be returned // The following line doesn't work in IE // return eval('(function (' + params.join(',')+ '){' + code + '})'); // This does though return eval('[function (' + params.join(',')+ '){' + code + '}][0]'); }
Perbedaan terbesar antara ini dan Fungsi baru adalah bahwa Fungsi tidak dicakup secara leksikal. Jadi itu tidak akan memiliki akses ke variabel penutupan dan saya akan.
sumber
arguments.slice()
for loop? Atau jika argumen bukan array yang benar[].slice.call(arguments, 1)
,.Hanya ingin menunjukkan beberapa sintaks yang digunakan dalam contoh di sini dan apa artinya:
var func = function(string) { return (new Function( 'return (' + string + ')' )()); }
perhatikan bahwa Fungsi (...) () memiliki "()" di akhir. Sintaks ini akan menyebabkan func menjalankan fungsi baru dan mengembalikan string bukan fungsi yang mengembalikan string, tetapi jika Anda menggunakan berikut ini:
var func = function(string) { return (new Function( 'return (' + string + ')' )); }
Sekarang func akan mengembalikan fungsi yang mengembalikan string.
sumber
Jika yang Anda maksud, apakah itu akan menghasilkan hasil yang sama, maka ya ... tetapi hanya untuk eval (alias, "evaluasi string JavaScript ini") akan jauh lebih sederhana.
EDIT Di Bawah:
Ini seperti mengatakan ... apakah kedua soal matematika ini sama:
1 + 1
1 + 1 + 1 - 1 + 1 - 1 * 1/1
sumber
Function
objek mungkin menyimpan string dalam variabel anggota privateval
ketika Anda memanggil fungsi.Dalam contoh itu, hasilnya sama, ya. Keduanya menjalankan ekspresi yang Anda berikan. Inilah yang membuat mereka sangat berbahaya.
Tapi mereka melakukan hal yang berbeda di balik scense. Yang melibatkan
new Function()
, di belakang layar, membuat fungsi anonim dari kode yang Anda berikan, yang dijalankan saat fungsi tersebut dipanggil.JavaScript yang Anda berikan secara teknis tidak dijalankan sampai Anda menjalankan fungsi anonim. Ini berbeda dengan
eval()
yang langsung mengeksekusi kode, dan tidak menghasilkan fungsi berdasarkan kode tersebut.sumber
Does the Function() one use another stack call level than eval?
: Saya akan berasumsi demikian, karenaeval()
tidak membuat fungsi dari input Anda - itu hanya mengeksekusinya.new Function()
membuat fungsi baru, yang kemudian dipanggil.