【问题标题】:NodeJS REPL: Why does this variable assignment fail?NodeJS REPL:为什么这个变量赋值失败?
【发布时间】:2012-08-21 00:55:06
【问题描述】:

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

【问题讨论】:

  • 请注意:延迟 > 0 时也存在问题,匿名函数不存在:!function() { f = 2}(); 按预期工作。我不知道......也许是一个错误?
  • 我认为“this”developer.mozilla.org/en-US/docs/DOM/…对“this”问题有一些影响:)
  • @chumkiu 代码中没有使用关键字“this”。为什么要对上述问题负责?
  • @Javaguru 是的,但useGlobal if set to true , then the repl will use the global object, instead of running scripts in a separate context. 选项我想它与this 有关(可能是低级错误)

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多