1

如何从new Function()构造函数返回最后一个值?似乎eval()默认情况下会这样做,以及vm.Script#runInContext.

我只想在浏览器中创建一个 REPL(我可以在其中执行类似的操作并在输出中2+2;返回) ,但没有(本地函数范围访问等)的缺点4evalevalAsyncFunction

4

2 回答 2

1

您可以使用Web Worker在隔离范围内运行某些东西。您可以在那里安全地使用eval,而不必担心访问页面的局部范围变量。尝试这样的事情:

function run() {
  const code = `
  self.onmessage = async (evt) => {
    let result;
    try {
      result = await eval(evt.data);
    } catch(err) {
      result = 'Error: ' + err.message;
    }  
    self.postMessage(result);
  };
  `;
  const blob = new Blob([code], {
    type: "text/javascript"
  });
  const worker = new Worker(window.URL.createObjectURL(blob));
  worker.onmessage = function(e) {
    document.getElementById('out').value = e.data;
  }
  worker.postMessage(document.getElementById('repl').value);
}
<label for="repl">REPL:</label>
<input type="text" id="repl">
<button onclick="run()">Execute</button>
<p/>
<label for="out">Output:</label>
<input type="text" id="out" readonly>

受到这个答案的启发:)

于 2021-11-12T09:11:30.997 回答
0

没有办法做到这一点。

new Function()根据关于 Function objects 的 ECMAScript 规范部分,不提供任何方法来访问其调用的“完成记录”

所以如果你需要最后一个值,你必须使用eval()

于 2021-11-12T08:56:03.207 回答