我想通过评估用户提供的字符串来构建一个简单的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'工作,或者返回一个不同的错误。 –