javascript – NodeJS REPL:为什么这个变量赋值失败?

有人可以帮我理解以下行为吗?我希望,因为我可以从这个回调中设置全局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].基本上发生的是它将所有变量从指定的沙箱对象复制到它运行代码的实际全局对象,执行代码,然后将所有内容复制回来.使用setTimeout时,将在复制完所有内容后进行更改.对此的责任部分在于repl模块[2],部分在于vm模块[3].我相信vm模块将在下一版本进行大修.

> [1] https://github.com/joyent/node/blob/master/lib/repl.js#L111
> [2] https://github.com/joyent/node/blob/master/lib/repl.js#L341
> [3] https://github.com/joyent/node/blob/master/src/node_script.cc#L114

点赞