Eval Javascript字符串并存储stdout



我得到Js作为一个字符串,我需要执行该脚本并将输出与某些内容进行比较。我在这里使用eval(),但可以是任何内容。它在浏览器的客户端运行。

有没有什么方法可以在不更改字符串a的情况下做到这一点?

let a = "console.log("a")";
eval(a);
let stdout = ???

使用:

  • bind()
  • call()

您可以扩展console.log,以便为所有日志条目保留一个附加的、单独的实时记录。

在下面的工作示例中,您可以看到,每次将某个内容记录到console时,它都会同时添加到console.stdout数组中。


工作示例:

console.stdout = [];
console.logInclStdout = console.log.bind(console);
console.log = (logEntry) => {
console.stdout.push(logEntry);
console.logInclStdout.call(console, logEntry);
}

let a = "console.log('a')";
let b = "console.log('b')";
let c = "console.log('c')";
let saferFasterEval = (input) => Function(`"use strict"; ${input}`)();
saferFasterEval(a);
saferFasterEval(b);
saferFasterEval(c);
// When you want to see what has been logged via console.log
console.info(console.stdout);

如果您想将用console.log执行的消息保存在eval中,一种方法是覆盖console.log,但我不建议覆盖或使用eval

// Store the original console.log function
const temp = console.log;
// Create an array to hold the commands
const cmds = []
// Overwrite the console.log to store the logs
console.log = (msg) => { cmds.push(msg) };
// Run A
let a = "console.log("a")";
eval(a);
// Run B
let b = "console.log("b")";
eval(b);
// Run C
let c = "console.log("c")";
eval(c);
// Get the logs; You can use `cmd.join('n')` to get the messages as a string
let stdout = cmds;
// Revert to orignal console.log
console.log = temp

示例:https://jsfiddle.net/x0w2q4Le/4/

Eval在将输出传递给变量时返回输出:

let a = `
let test = 10
test++
test
`
let stdout = eval(a)

只需将您想要返回的值放在的末尾

最新更新