如何从new Function()
构造函数返回最后一个值?似乎eval()
默认情况下会这样做,以及vm.Script#runInContext
.
我只想在浏览器中创建一个 REPL(我可以在其中执行类似的操作并在输出中2+2;
返回) ,但没有(本地函数范围访问等)的缺点4
eval
eval
AsyncFunction
如何从new Function()
构造函数返回最后一个值?似乎eval()
默认情况下会这样做,以及vm.Script#runInContext
.
我只想在浏览器中创建一个 REPL(我可以在其中执行类似的操作并在输出中2+2;
返回) ,但没有(本地函数范围访问等)的缺点4
eval
eval
AsyncFunction
您可以使用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>
受到这个答案的启发:)
没有办法做到这一点。
new Function()
根据关于 Function objects 的 ECMAScript 规范部分,不提供任何方法来访问其调用的“完成记录”。
所以如果你需要最后一个值,你必须使用eval()