Ada beberapa hal yang tidak mungkin dilakukan di JS tanpa fungsi eval-seperti ( eval
, Function
, dan mungkin lebih).
Ambil apply
contoh. Mudah digunakan saat menggunakannya pada panggilan fungsi biasa:
foo.apply(null, [a, b, c])
Tetapi bagaimana Anda melakukan ini untuk objek yang Anda buat melalui sintaks baru?
new Foo.apply(null, [a, b, c])
tidak berfungsi, atau bentuk yang serupa.
Tetapi Anda dapat mengatasi keterbatasan ini melalui eval
atau Function
(saya gunakan Function
dalam contoh ini):
Function.prototype.New = (function () {
var fs = [];
return function () {
var f = fs[arguments.length];
if (f) {
return f.apply(this, arguments);
}
var argStrs = [];
for (var i = 0; i < arguments.length; ++i) {
argStrs.push("a[" + i + "]");
}
f = new Function("var a=arguments;return new this(" + argStrs.join() + ");");
if (arguments.length < 100) {
fs[arguments.length] = f;
}
return f.apply(this, arguments);
};
}) ();
Contoh:
Foo.New.apply(null, [a, b, c])
;
Tentu saja, Anda dapat secara manual membangun fungsi-fungsi yang Function.prototype.New
menggunakan, tetapi tidak hanya verbose dan kikuk ini, itu (menurut definisi) harus terbatas. Function
memungkinkan kode berfungsi untuk sejumlah argumen.
eval
potongan besar kode seperti yang diinginkan aplikasi seperti JSPacker? JSPacker + gzip biasanya menghasilkan ukuran file yang lebih kecil daripada kedua solusi itu sendiri, tetapi ketika Anda benar menunjukkan pada dasarnya menjalankan kompiler dua kali pada potongan kode yang sama, ditambah beberapa overhead untuk melakukan penggantian string.