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

时间:2012-08-26 00:10:07

标签: javascript node.js scope global read-eval-print-loop

有人可以帮我理解以下行为吗?我希望,因为我可以从这个回调中设置全局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我得到了我期望的行为。)

2 个答案:

答案 0 :(得分:2)

这是因为Node的故障vim模块正在幕后运行你的代码。当您禁用useGlobal时,它会更改其运行代码的方式,从vm.runInThisContext更改为vm.runInContext [1]。基本上发生的是它将所有变量从指定的沙箱对象复制到它运行代码的实际全局对象,执行代码,然后将所有内容复制回来。当您使用setTimeout时,在复制完所有内容后进行更改。对此的责任部分在于repl模块[2],部分在于vm模块[3]。我相信vm模块将在下一版本进行大修。

答案 1 :(得分:-1)

尝试在控制台中输入 .clear。 它为我更新了全局值。

从选定的答案中,以下行对我不起作用。 repl.start('>',{useGlobal: true});