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
函数中的代码,它创建的 foo
和 bar
将仅在调用该函数期间在该函数中创建(除非您保留在某处引用它们)。
例如:
function blah($scope) {
eval(yourString);
}
...将仅在该函数内创建 foo
和 bar
,并且它们将有权访问 $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
来自可信来源的代码。
可能值得注意的是,这仅适用于 直接调用 到 eval
。 eval
很特别;如果您通过变量间接调用它:
var e = eval;
e(yourString);
... 的工作方式不同(具体来说,它在全局范围内工作,而不是在您调用它的同一范围内工作)。这就是为什么您有时会看到类似 (0,eval)(string);
的代码:它间接调用 eval
,使其在全局而不是在本地运行。 (为什么不直接使用 var globalEval = eval;
然后 globalEval(string);
?有些人真的很喜欢他们的 l33t 东西,比如 (0,eval)(...)
。我,我更喜欢可维护性,所以如果我需要一个全局评估 [haven' t 年],我会走 globalEval
路线...)
我正在构建 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
函数中的代码,它创建的 foo
和 bar
将仅在调用该函数期间在该函数中创建(除非您保留在某处引用它们)。
例如:
function blah($scope) {
eval(yourString);
}
...将仅在该函数内创建 foo
和 bar
,并且它们将有权访问 $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
来自可信来源的代码。
可能值得注意的是,这仅适用于 直接调用 到 eval
。 eval
很特别;如果您通过变量间接调用它:
var e = eval;
e(yourString);
... 的工作方式不同(具体来说,它在全局范围内工作,而不是在您调用它的同一范围内工作)。这就是为什么您有时会看到类似 (0,eval)(string);
的代码:它间接调用 eval
,使其在全局而不是在本地运行。 (为什么不直接使用 var globalEval = eval;
然后 globalEval(string);
?有些人真的很喜欢他们的 l33t 东西,比如 (0,eval)(...)
。我,我更喜欢可维护性,所以如果我需要一个全局评估 [haven' t 年],我会走 globalEval
路线...)