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
咦!
第一次运行设置它; 第二个不影响它。
(设置useGlobal
: true
我得到了我期望的行为。)
这是因为Node的错误vim模块,这是在后台运行你的代码。 当禁用useGlobal时,这将改变它运行代码的方式,从vm.runInThisContext改变为vm.runInContext [1]。 从本质上来说,它会将指定的沙箱对象的所有variables复制到运行代码的实际全局对象中,执行代码,然后将所有内容都复制回来。 当你使用setTimeout的时候,所有的东西都被复制过来了。 这一责任部分在于repl模块[2]和部分在vm模块[3]中。 我相信这个虚拟机模块将在下一个版本中进行检修。