我在下面的案例中发现了一个关于 eval(( 危险的类似问题,但答案并没有解决问题并回答了它是否危险,它只是提出了另一种方法。这就是为什么我再次询问希望得到新的答案。它也被张贴在2016
年
所以我想传递一个条件作为参数,我知道这可以是一个函数,但我读过eval ()
比new function () {return ...;}
快 67%,这就是我使用 eval (( 的原因
这是代码
var a = [0];
function LoopWithDelay (func, delay, param, condition){
console.log(eval (condition));
if (eval (condition)) {
func (param);
setTimeout (LoopWithDelay, delay, func, delay, param, condition);
}
}
function increment (x){
x[0] += 5;
}
LoopWithDelay (increment, 1000, a, "a[0]<10" );
调用LoopWithDelay()
函数时,我将最终参数(条件(作为字符串传递,以便在函数eval (condition)
内对其进行计算
在这种情况下使用eval()
有错吗?
[编辑]
我的主要重点是使这段代码可重用并消除冗余。这就是为什么我想将条件作为参数传递。
示例:
在测试应用程序中,屏幕根据剩余时间以不同的速度闪烁。
如果t = 0s每2000ms闪烁一次,如果每1000ms
闪烁10s
看起来您只是在尝试进行动态测试,该测试可以对运行时代码中更改的内容做出反应。您通常通过将函数作为参数传递来执行此操作,而不是带有稍后"eval((ed"代码的字符串。这是您通常传递"行为"或评估仅在运行时可用的内容的方式。这在javascript中很常见。这具有相同的行为,但不需要eval()
:
var a = [0];
function LoopWithDelay(func, delay, param, condition) {
let condition_val = condition()
console.log(condition_val);
if (condition_val) {
func(param);
setTimeout(LoopWithDelay, delay, func, delay, param, condition);
}
}
function increment(x) {
x[0] += 5;
}
// capture `a` in the closure of the passed-in function
LoopWithDelay(increment, 1000, a, () => a[0] < 10);