如何從new Function()建構式回傳最后一個值?似乎eval()默認情況下這樣做,以及vm.Script#runInContext.
我只想在瀏覽器中創建一個 REPL(我可以在其中執行類似操作2 2;并4在輸出中回傳),例如eval,但沒有eval(本地函式范圍訪問AsyncFunction等)的缺點
uj5u.com熱心網友回復:
沒有辦法做到這一點。
new Function()根據有關 Function objects的ECMAScript 規范部分,不提供任何方式來訪問其呼叫的“完成記錄”。
所以如果你需要最后一個值,你必須使用 eval()
uj5u.com熱心網友回復:
您可以使用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>
受到這個答案的啟發:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356486.html
標籤:javascript 评估 函数构造器
