我有一个正确格式化为函数的文本字符串,我想将其转换为实际函数。文本字符串如下所示:
function object_123(){
object_123_Action();
my_clicked(obj);
}
除了“function”和{}
之外;所有其他文本都是动态构造的。即它可能永远不会包含object_123_Action()
,但它会是类似的基本函数调用。唯一的问题是obj
将需要成为分配函数的对象。
基本上,我需要:
this.func = eval(func_txt); //to actually work.
func_txt在哪里:
function object_123(){
object_123_Action();
my_clicked(this);
}
答案 0 :(得分:1)
您的字符串包含函数声明。
评估时,它会在eval范围内创建一个object_123
变量(稍后可以调用)并且不返回任何内容。
如果要将函数分配给this.func
,则需要将声明转换为函数表达式。你可以把它包裹在parens中。
this.func = eval("(" + func_txt ")" );
var func_txt = "function object_123(){\
object_123_Action();\
my_clicked(obj);\
}";
this.func = eval("(" + func_txt + ")");
var obj = "...";
function object_123_Action() {
alert(1);
}
function my_clicked() {
alert(2);
}
this.func();
答案 1 :(得分:0)
您可以将函数存储在对象的数组中。 然后,循环执行另一个函数中的函数并执行它们。
var myObj = { 'myfunctions': [ ] };
并添加功能:
myObj.myFunctions.push (function () { /*function code here*/ });
或者如果您已经有一个命名函数:
myObj.myFunctions.push (nameOfFunction);
要调用所有函数,请使用此函数(不要将此函数添加到myObj)
function executeMyFunctions (myObj) {
for (var i = 0; i < myObj.myFunctions.length; i++) {
myObj.myFunctions[i]();
}
}
如果可以avoid using eval
,你应该这样做。
答案 2 :(得分:0)
试试这个:
function parseStringToFunction(func) {
func = func || '(function(){return null;})';
return (new Function('return ' + func)());
};
var stringifyFunction = '(function(a, b) { return a+b; })';
var callStringifyFunction = parseStringToFunction(stringifyFunction)(1, 2);
alert(callStringifyFunction); // results is 3
答案 3 :(得分:-1)
试试这个 -
$("<script type='text/javascript'></script>").html(func_txt).insertAfter($("script"));
答案 4 :(得分:-1)
这有效:
assert( eval("(function(a, b) { return a+b; })")(1, 2) == 3 )
只需将功能包装在parens中。