我想通過評估用戶提供的字符串來構建一個簡單的REPL。它似乎大部分工作,除了像「函數f(){...}」這樣的輸入,它對將來演示中哪些函數是可見的沒有影響。在玩了一下之後,我只能得出結論,我根本不瞭解eval。下面是一段簡短的片段,展示一些神祕的行爲:麻煩評估函數定義(...在JavaScript中)
var xeval = eval;
function silly() {}
eval("function good() {}");
function baffleMe() {
eval("alsoGood = function() {}");
eval("function notSoGood() {}");
xeval("function hope() {}");
xeval("function crushedHope() { silly(); }");
}
baffleMe();
good(); // Okay.
alsoGood(); // Okay.
notSoGood(); // ReferenceError: notSoGood is not defined
hope(); // Why does this even work?
crushedHope(); // ReferenceError: silly is not defined
請問誰能解釋這些結果? (重複性同時在最新的Chrome和Firefox)
[編輯]
爲了澄清,只有當代碼在JavaScript控制檯或者工具如的jsfiddle被執行,而不是當嵌入腳本的最後調用失敗標籤。對接受的答案的評論包含對此的解釋。
查看'window.eval'(Node中的'global.eval')和'eval' – elclanrs
緊密相關:[global。eval無法訪問詞法範圍中的變量](http://stackoverflow.com/q/31459180/710446) – apsillers
如果您要創建REPL,則應該將字符串evals放入'try catch'語句中,並且如果錯誤消息是'意外的輸入結束',那麼提示輸入更多的代碼,直到'eval'工作,或者返回一個不同的錯誤。 –