'Is there a way to create a function from a string with javascript?
For example;
var s = "function test(){
alert(1);
}";
var fnc = aMethod(s);
If this is the string, I want a function that's called fnc. And fnc(); pops alert screen.
eval("alert(1);") doesnt solve my problem.
Solution 1:[1]
A better way to create a function from a string is by using Function:
var fn = Function("alert('hello there')");
fn();
This has as advantage / disadvantage that variables in the current scope (if not global) do not apply to the newly constructed function.
Passing arguments is possible too:
var addition = Function("a", "b", "return a + b;");
alert(addition(5, 3)); // shows '8'
Solution 2:[2]
You're pretty close.
//Create string representation of function
var s = "function test(){ alert(1); }";
//"Register" the function
eval(s);
//Call the function
test();
Here's a working fiddle.
Solution 3:[3]
Yes, using Function is a great solution but we can go a bit further and prepare universal parser that parse string and convert it to real JavaScript function...
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;
};
}
examples of usage:
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();
here is jsfiddle
Solution 4:[4]
Dynamic function names in JavaScript
Using 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'
Source: http://marcosc.com/2012/03/dynamic-function-names-in-javascript/
Using eval
var name = "foo";
// Implement it
eval("function " + name + "() { alert('Foo'); };");
// Test it
foo();
// Next is TRUE
foo.name === 'foo'
Using sjsClass
https://github.com/reduardo7/sjsClass
Example
Class.extend('newClassName', {
__constructor: function() {
// ...
}
});
var x = new newClassName();
// Next is TRUE
newClassName.name === 'newClassName'
Solution 5:[5]
This technique may be ultimately equivalent to the eval method, but I wanted to add it, as it might be useful for some.
var newCode = document.createElement("script");
newCode.text = "function newFun( a, b ) { return a + b; }";
document.body.appendChild( newCode );
This is functionally like adding this <script> element to the end of your document, e.g.:
...
<script type="text/javascript">
function newFun( a, b ) { return a + b; }
</script>
</body>
</html>
Solution 6:[6]
Use the new Function() with a return inside and execute it immediately.
var s = `function test(){
alert(1);
}`;
var new_fn = new Function("return " + s)()
console.log(new_fn)
new_fn()
Solution 7:[7]
An example with dynamic arguments:
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]))
Solution 8:[8]
If you have a function expression that is in string form and you want to make it a function, then you need to include a return statement in the string you pass to new Function.
const strFn = "const sum = (a, b) => a + b"
const newFn = new Function(`${strFn}; return sum`)();
console.log(newFn(2, 3)) // 5
If you don't execute immediately, you can use the function.call method to execute. Remember the first argument it takes is the this value
const newFn = new Function('const arrMultiplier = (arr) => arr.map(num => num * 2); return arrMultiplier')
console.log(newFn.call({}).call({}, [6, 4, 1, 0])); // [12, 8, 2, 0]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Lekensteyn |
| Solution 2 | James Hill |
| Solution 3 | |
| Solution 4 | |
| Solution 5 | |
| Solution 6 | Fernando Carvajal |
| Solution 7 | brunettdan |
| Solution 8 | Chukwualuka Chiama |
