4

有人可以帮我理解以下行为吗?我希望,因为我可以从这个回调中设置全局f,我也应该能够改变它。我不太了解节点如何在 REPL 中处理上下文与全局,以理解这一点,我将不胜感激。

开始一个 REPL 没有useGlobal

$ 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我得到了我期望的行为。)

4

2 回答 2

2

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

于 2012-10-04T10:14:37.840 回答
-1

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

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

于 2021-02-14T11:01:00.047 回答