我不确定您要在这里完成什么,但为了解决您的问题,您可以首先评估这些命令,假设它们填充给定的变量名称,然后使用该变量名称而不是
eval
的结果。 所以在你的情况下,这样的事情可能会起作用:
eval("var favoriteFood='pizza';");
alert(favoriteFood); // will alert with the message "pizza"
如果您期望用户在每一行上放置一个单独的命令,您可以循环遍历这些行并单独评估它们,如下所示:
eval("var favoriteFood='pizza';");
eval("favoriteFood += ' slices';");
alert(favoriteFood); // will alert with the message "pizza slices"
总的来说,你不应该像这样盲目地执行用户输入的数据,从安全角度来看这是一个大问题。 但我希望这对你今天做的菜有帮助。
编辑:(回答评论问题)
在你的情况下,而不是这个:
alert(eval(v));
你可以这样做:
eval(v);
alert(favoriteFood);
再次假设您在文本区域中设置了一个名为
favoriteFood
的变量。 如果您想删除该资格,我认为您没有办法使用 eval
来做到这一点。
你不明白
eval()
的作用。eval
将表达式作为输入并返回最后一个表达式的值:
console.log(eval("2+2")) // -> 4
console.log(eval("Math.pow(2, 10)")) // -> 1024
console.log(eval("let x = 100; x - 1")) // -> 99
console.log()
在 eval()
内部没有改变。它的作用与正常代码相同。
console.log()
怎么办?您可以重新定义
console
和console.log()
:
function executeCode(code) {
let logs = []; // Logs array
// Redefine console
let console = {
log(...args) { // We can pass as many args as we want
logs.push(args);
}
}
// Eval the code
eval(code);
// Return the logs
return logs;
}
// Demos
console.log(executeCode('console.log("Hello, world!")'))
console.log(executeCode('let x = 5; console.log("X is", x)'))
eval
是邪恶的let password = "1234"; // An important variable
let login = "vasya" // Another one
// Execute code
function executeCode(code) {
let logs = []; // Logs array
// Redefine console
let console = {
log(...args) { // We can pass as many args as we want
logs.push(args);
}
}
// Eval the code
eval(code);
// Return the logs
return logs;
}
// Code may be not yours, as example shared to you
console.log(executeCode('console.log("Got your password: ", password)')) // Code can access to almost anything
console.log(executeCode('login = "abcdef"')) // And can modify everything
console.log("INFO: Login is", login)
// Or it can redirect you
// console.log(executeCode('window.location.href = "example.com"'))
当然有一些方法可以确保这一点,如果你愿意的话 - 我可以添加它们