从用户输入的代码中获取输出 JavaScript

Get output from user typed code JavaScript

我正在试验 Monaco(VSCode IDE 用于网络)。目标是打印用户编写的代码的输出。前用户输入 console.log("123") 然后我想得到“123”作为输出。我怎样才能做到这一点?任何正则表达式或类似的解决方案都不好。我需要代码的实际输出:

        const run = () => {
            const model = monaco.current.editor.getModel()
            const value = model.getValue() // Value is console.log("123")
     
            var code = new Function(value)
            var code2 = eval(value)  //logs "123"

            console.log(code) //logs ƒ anonymous({console.log("123")}
            console.log(code2) //logs undefined
            
            const output = ?
        }
    
            <MonacoEditor
                ref={monaco}
                width="800"
                height="600"
                language="javascript"
                theme="vs-dark"
                value={code}
                options={options}
                onChange={code => setCode(code)}
            />

如何在本例中将 const output 设置为“123”?

或者只是将“123”作为此代码段的输出

var s = "console.log(123)"
alert(s)

var s = "console.log(123)"
alert(eval(s))

在上面的场景中,console.log 代码被执行并且日志记录将在控制台中完成,但是警报中的值将是 undefined 因为 return 值来自 console.log 的是 undefined。例如:

const val = console.log('test');

到这里已经完成了日志记录,但是val的值为undefined。并且您正在警报语句中使用此值。

To achieve what you need you can override the logging function as follows:

Console.prototype.log = function(text) {
   // your code
};

默认 console.log 函数无法做到这一点。你需要修改它。试试这个

console.tempLog = console.log;
console.log = function(value)
{
    console.tempLog(value);
    return value;
};

const output = eval('console.log("123")');

在这里,我创建了console.tempLog来避免递归循环!希望这对您有所帮助!