NodeJS REPL:为什么这个variables赋值失败?

有人能帮我理解下列行为吗? 我预料到,由于我可以在这个callback中设置全球f ,我也应该能够改变它。 我不明白在REPL中节点如何处理上下文和全局的问题,以便理解这一点,我非常感谢你的支持。

不使用useGlobal启动REPL

 $ cat test.js var repl = require('repl'); repl.start({useGlobal:false}); 

现在尝试连续两次设置f

 $ node test.js > f ReferenceError: f is not defined > setTimeout(function(){f=1;}, 0); > f 1 

第一次工作…现在再试一次:

 > setTimeout(function(){f=2;}, 0); > f 1 

咦!

第一次运行设置它; 第二个不影响它。

(设置useGlobaltrue我得到了我期望的行为。)

这是因为Node的错误vim模块,这是在后台运行你的代码。 当禁用useGlobal时,这将改变它运行代码的方式,从vm.runInThisContext改变为vm.runInContext [1]。 从本质上来说,它会将指定的沙箱对象的所有variables复制到运行代码的实际全局对象中,执行代码,然后将所有内容都复制回来。 当你使用setTimeout的时候所有的东西都被复制过来了。 这一责任部分在于repl模块[2]和部分在vm模块[3]中。 我相信这个虚拟机模块将在下一个版本中进行检修。