AngularJS/Javascript:获取 JS 函数作为 JSON/Text 并执行

AngularJS/Javascript: get JS Functions as JSON/Text and execute

我正在构建 AngularJS 应用程序,并想做以下事情:

我通过 Web 服务调用获取 JS 代码:

{ 
 "script":"function foo(a, b) { c = bar(a,b) $scope.c = c } function bar(a,b) { return a+b }"
}

在我的 AngularJS 应用程序中,我想调用 foo(a,b) 并将我的 $scope 中的 属性 c 设置为在函数 bar(a, b).

这可能吗?函数 foo(a,b) 可以访问 $scope 吗?如果我的应用程序中已经存在函数 foo() 或 bar() 怎么办?

我已经在研究 JS 中的 eval 和 Function() 功能。但是我不确定这样能不能解决我的问题

pass function in json and execute

非常感谢任何帮助或指导:)

干杯

凯文

我会看看你是否可以以不同的方式构建事物。它通常是一个 大红旗 如果你像这样将代码作为文本传递,然后对其进行评估。重构,以便尽可能使用正确的代码。

除此之外:

I was already looking at the eval and Function() functionality in JS. But I'm not sure if I can solve my problem like this.

是的,可以。 eval 在您调用它的范围内工作(这有点神奇)。因此,如果您 eval 函数中的代码,它创建的 foobar 将仅在调用该函数期间在该函数中创建(除非您保留在某处引用它们)。

例如:

function blah($scope) {
    eval(yourString);
}

...将仅在该函数内创建 foobar,并且它们将有权访问 $scope 参数。

(请参阅下面 e

之后的注释

实例:

var str = "function foo() { $scope.x = a + b; }";
function bar($scope) {
  var a = Math.floor(Math.random() * 10),
      b = Math.floor(Math.random() * 10);
  eval(str);
  foo();
  snippet.log("$scope.x = " + $scope.x);
}
snippet.log("typeof foo === " + typeof foo);
bar({});
snippet.log("typeof foo === " + typeof foo);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

最后警告:请确保您只调用 eval 来自可信来源的代码


可能值得注意的是,这仅适用于 直接调用 evaleval很特别;如果您通过变量间接调用它:

var e = eval;
e(yourString);

... 的工作方式不同(具体来说,它在全局范围内工作,而不是在您调用它的同一范围内工作)。这就是为什么您有时会看到类似 (0,eval)(string); 的代码:它间接调用 eval,使其在全局而不是在本地运行。 (为什么不直接使用 var globalEval = eval; 然后 globalEval(string);?有些人真的很喜欢他们的 l33t 东西,比如 (0,eval)(...)。我,我更喜欢可维护性,所以如果我需要一个全局评估 [haven' t 年],我会走 globalEval 路线...)