Apabila saya melihat kod sumber Templat JavaScript, saya mendapati penggunaan yang sangat menarik untuk menjana fungsi, saya fikir, bukankah ini pengaturcaraan meta?
JavaScript Metaprogramming
Metaprogramming merujuk kepada penulisan jenis atur cara komputer tertentu yang menulis atau memanipulasi atur cara lain (atau diri mereka sendiri) sebagai data mereka, atau menyelesaikan beberapa kerja pada masa jalan yang sepatutnya disiapkan pada masa penyusunan.
JavaScript eval
Fungsi eval() menilai rentetan dan melaksanakan kod JavaScript di dalamnya.
Ia boleh digunakan seperti berikut:
eval("x=10;y=20;document.write(x*y)")
Sudah tentu, ini hanya digunakan untuk melaksanakan fungsi tertentu, tetapi produk ini sangat kos efektif dan mudah ralat.
Fungsi eval harus dielakkan apabila mungkin.
Jadi cara yang lebih baik ialah menggunakan New Function()
Perbezaan besar antara menggunakan New Function() dan eval() ialah eval bukan sekadar fungsi,
eval() menilai rentetan sebagai ungkapan JavaScript dalam skop pelaksanaan semasa dan boleh mengakses pembolehubah setempat. New Function() menghuraikan rentetan yang disimpan di dalamnya ke dalam objek fungsi yang kemudiannya boleh dipanggil oleh kod JavaScript. Oleh kerana kod berjalan dalam skop yang berasingan, pembolehubah tempatan tidak boleh diakses.
Dengan kata lain, eval() akan mengganggu skop fungsi semasa. .
Fungsi baharu JavaScript()
Pembina Fungsi mencipta objek Fungsi baharu Dalam JavaScript, setiap fungsi (fungsi) sebenarnya ialah objek Fungsi Objek Fungsi yang dijana menggunakan pembina Fungsi dihuraikan apabila fungsi dibuat. Ini kurang cekap berbanding jika anda mengisytiharkan fungsi dan memanggilnya dalam kod anda, kerana fungsi yang diisytiharkan menggunakan penyataan fungsi dihuraikan bersama dengan penyataan lain.
Fungsi Baharu() akan menjadi kurang cekap jika dibandingkan, dan inilah yang boleh kita ramalkan dalam situasi semasa.
Contoh mudah kelihatan seperti ini:
var add = new Function(['x', 'y'], 'return x y');
new Function() akan menghuraikan rentetan ke dalam fungsi. . Kemudian kita boleh melaksanakannya melalui apply
Function.apply(null, args)
Dan inilah yang saya lihat dalam Templat JavaScript:
Fungsi baharu(
tmpl.arg ',tmpl',
"var _e=tmpl.encode" tmpl.helper ",_s='"
str.replace(tmpl.regexp, tmpl.func)
"';kembali _s;"
);
Sudah tentu kita mempunyai kaedah lain.