【发布时间】:2019-04-17 18:47:36
【问题描述】:
我想定义一个函数,它将充当while 语句(带有一些插件,但为了简单起见,我将在这里展示一个基本的包装器)。所以将条件作为第一个参数,将在每个循环中执行的回调作为第二个参数。
我最初是用这个版本来的:
const wrappedWhile = (conditions, callback) => {
let avoidInfinite = 0;
while (conditions) {
callback();
if (avoidInfinite >= 10) {
console.log('breaking while statement for avoiding infinite loop');
break;
}
avoidInfinite++;
}
};
let i = 0;
wrappedWhile(i < 5, () => {
console.log('log from callback: i =', i);
if (i >= 5) {
console.log('the loop continues whereas it should stop');
}
i++;
});
从逻辑上讲,它应该在i >= 5 时停止。但是conditions 参数是wrappedWhile 函数中的一个简单布尔值,所以它总是true,因为i 在调用时小于5。
然后,我想出了另一个版本,在循环的每次迭代中都会评估 conditions:
const wrappedWhile = (conditions, callback) => {
while (Function('return ' + conditions + ';')()) {
callback();
}
};
let i = 0;
wrappedWhile('i < 5', () => {
console.log('log from callback: i =', i);
i++;
});
但是,如果我没记错的话,Function 使用eval() 是为了工作,而且我们都曾经听说过eval() 的使用对于代码注入来说并不安全。
现在我的问题很简单:是否有更安全的替代方法可以实现我想要实现的目标?
经过一番研究,我发现了一个link,它展示了一种在沙盒环境中evalify的方法,但我不知道这是不是好方法。
【问题讨论】:
-
你能传递函数
() => i < 5吗?毕竟,你正在传递另一个函数…… -
谢谢,它正在工作(正如 wanjas 在他的回答中显示的那样)。它与
while语法有点不同,但我想它已经足够好了!
标签: javascript security while-loop eval