Javascript .eval() 返回未定义

问题描述 投票:0回答:2
javascript ruby-on-rails eval
2个回答
0
投票

我不确定您要在这里完成什么,但为了解决您的问题,您可以首先评估这些命令,假设它们填充给定的变量名称,然后使用该变量名称而不是

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
来做到这一点。


0
投票

你不明白

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"')) 

当然有一些方法可以确保这一点,如果你愿意的话 - 我可以添加它们

© www.soinside.com 2019 - 2024. All rights reserved.