Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON字符串转换为角度函数?_Javascript_Angularjs - Fatal编程技术网

Javascript 将JSON字符串转换为角度函数?

Javascript 将JSON字符串转换为角度函数?,javascript,angularjs,Javascript,Angularjs,我有一个angular服务获取一些JSON数据,在这个数据中我有一个字符串函数(在服务器端构建它并将其传递给angular),类似于: { "fn": "function( data ) { data.rendered = data.value; }" } 是否可以解析它并将其用作具有角度的表达式?即 settings.myCustomFunction = serviceData.fn; 我曾尝试使用eval、$eval、$parse的不同组合来实现这一点,但我对其中任何一种组合都没

我有一个angular服务获取一些JSON数据,在这个数据中我有一个字符串函数(在服务器端构建它并将其传递给angular),类似于:

{
    "fn": "function( data ) { data.rendered = data.value; }"
}
是否可以解析它并将其用作具有角度的表达式?即

settings.myCustomFunction = serviceData.fn;
我曾尝试使用
eval
$eval
$parse
的不同组合来实现这一点,但我对其中任何一种组合都没有任何运气。它们要么抛出关于“意外*”的错误,要么不抛出错误,但似乎什么都不做。

您可以执行以下操作:

执行:

settings.myCustomFunction();//

可以将字符串用括号括起来以避免语法错误

eval("(" + fnString + ")")
这使得它成为一个语法上有效的JavaScript语句,它由一个函数表达式组成,您可以自由传递

匿名函数本身,没有任何括号或LHS运算符(如常用的赋值运算符
=
)作用于它,在语法上不是有效的JavaScript语句。这就是为什么在JS中会看到用括号括起来的IIFEs(立即调用的函数表达式):

(function() {
  // ...
})()

如果你真的想让eval工作,那么你可以这样做:

var settings = {};
eval("settings.myCustomFunction = " + serviceData.fn);

当然,以这种方式使用eval会打开您的应用程序,使其面临可能的恶意脚本注入。

您可能需要签出
eval.call
。这允许您不必关心参数是什么,而是使用字符串中的任何参数。当然,要调用它,您必须使用相同的参数,但是,您也可以使用字符串驱动,方法是在
eval.call
it时将arg合并在一起

{
    "fn": "function( data ) { return data + 1; }"
}
例如:

var serviceData={
fn:'(函数(数据){返回数据+1;})'
};
var数据=44;
var结果=window.eval.call(window,serviceData.fn)(数据);

console.log(结果);//45
new Function()
是解决问题的方法,尽管我很想让它工作,但不幸的是,我在尝试使用它时遇到了一个“意外的标记;”错误,控制台正好指向
fnString
之后作为错误源,所以我假设它说的是
data.value
@Samsquanch后面的分号,真的吗?这很奇怪,因为它对我有效。除非函数本身有语法错误,否则这根本不是语法错误。从另一个注释复制/粘贴:如果直接使用该函数,即
settings.myCustomFunction=function(data){data.rendered=data.value;}
,该函数将正常工作。我同意,这很奇怪。@Samsquanch我认为这是你的函数,因为
eval
会检测函数本身的语法错误。如果是这样,为什么我将确切的函数复制/粘贴到代码本身会工作得很好?这个函数返回“数据未定义”,但如果直接使用函数,函数工作正常,即
settings.myCustomFunction=function(data){data.rendered=data.value;}
。只要在执行时将
data
in作为参数传递,就会定义它,例如
eval(“var x=function(data){return data+1;}”);x(1)工作此函数使用
settings.myCustomFunction=new Function(serviceData.fn)
返回“数据未定义”,但如果直接使用该函数,该函数将正常工作,即
settings.myCustomFunction=Function(data){data.rendered=data.value;}
@Samsquanch,请尝试
settings.myCustomFunction=new函数('data','data.rendered=data.value;')
。我不确定这在我的用例中是否有效。这是立即调用函数的更多功能,对吗?这是一个回调函数。(我想这就是我们考虑的问题,我不确定在JavaScript中该调用什么)。您可以随时执行调用。也许我错过了什么,但我想你可以。换句话说,它不是作为函数挂起的,而是作为字符串存在的。当你想叫它的时候,你就这么叫它。
{
    "fn": "function( data ) { return data + 1; }"
}