Jawaban:
Saya menambahkan tes jsperf untuk 4 cara berbeda untuk membuat fungsi dari string:
Menggunakan RegExp dengan kelas Fungsi
var func = "function (a, b) { return a + b; }".parseFunction();
Menggunakan kelas Fungsi dengan "return"
var func = new Function("return " + "function (a, b) { return a + b; }")();
Menggunakan konstruktor Fungsi resmi
var func = new Function("a", "b", "return a + b;");
Menggunakan Eval
eval("var func = function (a, b) { return a + b; };");
Cara yang lebih baik untuk membuat fungsi dari string adalah dengan menggunakan Function:
var fn = Function("alert('hello there')");
fn();
Ini memiliki keuntungan / kerugian bahwa variabel dalam cakupan saat ini (jika tidak global) tidak berlaku untuk fungsi yang baru dibangun.
Meneruskan argumen juga dimungkinkan:
var addition = Function("a", "b", "return a + b;");
alert(addition(5, 3)); // shows '8'
FunctionAnda tidak mencemari cakupan lokal dan inilah mengapa evalmembuat pengoptimalan menjadi sangat sulit untuk mesin ... Dengan contoh OP, saya akan:var fnc = Function('return '+s)();
element.onclick = function() { alert("test"); }.
Anda cukup dekat.
//Create string representation of function
var s = "function test(){ alert(1); }";
//"Register" the function
eval(s);
//Call the function
test();
Ini biola yang berfungsi .
evalPeringatan wajib bagi pencari di masa mendatang: evaldapat membuka celah bagi peretas: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… tetapi jika Anda mengetahui bahayanya dan dapat menghindarinya, ini adalah cara sederhana yang bagus untuk membuat fungsi dari string
Ya, menggunakan Functionadalah solusi yang bagus tetapi kita bisa melangkah lebih jauh dan menyiapkan parser universal yang mengurai string dan mengubahnya menjadi fungsi JavaScript nyata ...
if (typeof String.prototype.parseFunction != 'function') {
String.prototype.parseFunction = function () {
var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
var match = funcReg.exec(this.replace(/\n/g, ' '));
if(match) {
return new Function(match[1].split(','), match[2]);
}
return null;
};
}
contoh penggunaan:
var func = 'function (a, b) { return a + b; }'.parseFunction();
alert(func(3,4));
func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction();
func();
di sini adalah jsfiddle
JavaScriptFunctionvar name = "foo";
// Implement it
var func = new Function("return function " + name + "(){ alert('hi there!'); };")();
// Test it
func();
// Next is TRUE
func.name === 'foo'
Sumber: http://marcosc.com/2012/03/dynamic-function-names-in-javascript/
evalvar name = "foo";
// Implement it
eval("function " + name + "() { alert('Foo'); };");
// Test it
foo();
// Next is TRUE
foo.name === 'foo'
sjsClasshttps://github.com/reduardo7/sjsClass
Class.extend('newClassName', {
__constructor: function() {
// ...
}
});
var x = new newClassName();
// Next is TRUE
newClassName.name === 'newClassName'
Teknik ini mungkin pada akhirnya setara dengan metode eval, tetapi saya ingin menambahkannya, karena mungkin berguna bagi sebagian orang.
var newCode = document.createElement("script");
newCode.text = "function newFun( a, b ) { return a + b; }";
document.body.appendChild( newCode );
Ini secara fungsional seperti menambahkan elemen <script> ini ke akhir dokumen Anda, misalnya:
...
<script type="text/javascript">
function newFun( a, b ) { return a + b; }
</script>
</body>
</html>
Gunakan new Function()dengan kembali ke dalam dan jalankan segera.
var s = `function test(){
alert(1);
}`;
var new_fn = new Function("return " + s)()
console.log(new_fn)
new_fn()
Contoh dengan argumen dinamis:
let args = {a:1, b:2}
, fnString = 'return a + b;';
let fn = Function.apply(Function, Object.keys(args).concat(fnString));
let result = fn.apply(fn, Object.keys(args).map(key=>args[key]))