Есть ли способ создать функцию из строки с помощью javascript?
например:
var s = "function test(){
alert(1);
}";
var fnc = aMethod(s);
Если это строка, я хочу функцию, которая называется fnc. И fnc();
экран уведомление.
eval("alert(1);")
не решает мою проблему.
8 ответов:
Я добавил тест jsperf для 4 различных способов создания функции из строки:
используя регулярное выражение с классом функций
var func = "function (a, b) { return a + b; }".parseFunction();
использование класса функций с "return"
var func = new Function("return " + "function (a, b) { return a + b; }")();
используя официальный конструктор функций
var func = new Function("a", "b", "return a + b;");
используя Эвал
eval("var func = function (a, b) { return a + b; };");
лучший способ создать функцию из строки, используя
Function
:var fn = Function("alert('hello there')"); fn();
это имеет как преимущество / недостаток, что переменные в текущей области (если не глобальные) не применяются к вновь построенной функции.
передача аргументов тоже возможно:
var addition = Function("a", "b", "return a + b;"); alert(addition(5, 3)); // shows '8'
вы довольно близки.
//Create string representation of function var s = "function test(){ alert(1); }"; //"Register" the function eval(s); //Call the function test();
здесь рабочая скрипку.
Да, с помощью
Function
это отличное решение, но мы можем пойти немного дальше и подготовить универсальный парсер, который разбирает строку и преобразует ее в реальную функцию JavaScript...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; }; }
примеры использования:
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();
здесь это jsfiddle
имена динамических функций в
JavaScript
используя
Function
var name = "foo"; // Implement it var func = new Function("return function " + name + "(){ alert('hi there!'); };")(); // Test it func(); // Next is TRUE func.name === 'foo'
Источник:http://marcosc.com/2012/03/dynamic-function-names-in-javascript/
используя
eval
var name = "foo"; // Implement it eval("function " + name + "() { alert('Foo'); };"); // Test it foo(); // Next is TRUE foo.name === 'foo'
используя
sjsClass
https://github.com/reduardo7/sjsClass
пример
Class.extend('newClassName', { __constructor: function() { // ... } }); var x = new newClassName(); // Next is TRUE newClassName.name === 'newClassName'
этот метод может быть в конечном счете эквивалентен методу eval, но я хотел бы добавить его, так как это может быть полезно для некоторых.
var newCode = document.createElement("script"); newCode.text = "function newFun( a, b ) { return a + b; }"; document.body.appendChild( newCode );
это функционально похоже на добавление этого элемента
... <script type="text/javascript"> function newFun( a, b ) { return a + b; } </script> </body> </html>