【问题标题】:Javascript Scope Unexpected Results [duplicate]Javascript范围意外结果[重复]
【发布时间】:2016-01-02 00:09:07
【问题描述】:

我已经与这个问题斗争了几个小时,我在 node.js 中运行的 js 代码如下。

setInterval(function () {
    var exampleVar;
    exec('cat /path/to/unimportant/file', function (error, stdout, stderr) { // This function returns errors, stdout and stderr
        console.log(stdout); // correct value
        exampleVar = stdout;
        console.log(exampleVar); // correct value
    }
    console.log(exampleVar); // undefined
}, unimportantTime);

我认为因为该变量已经由函数 exec 创建的父范围声明,所以我可以为其分配一个值。有人可以解释我做错了什么以及访问范围外变量的正确方法吗?

【问题讨论】:

  • 只是出于好奇,对一个问题投反对票是否是惯例,因为它有一个简单的答案,对于初学者来说是一个难以理解的概念?
  • 我不认为这样的问题有什么问题,但一个原因可能是因为同一问题的变体每天被问多次,有些人可能会得到“哦,不,而不是再次”的反应。
  • 对常见问题投反对票是惯例;/

标签: javascript node.js scope


【解决方案1】:

您的问题不是范围,而是同步问题。

在 Node.js 中,大多数函数默认是异步的,这意味着无论这些函数是否真正完成运行,程序的执行都会继续。

所以发生的情况是,您的最后一个 console.log(exampleVar) 在传递给 exec 的函数有时间执行之前执行(因为 IO 操作通常比执行缓存的 JS 代码慢得多)。

请参阅this primer 以获得更深入的解释。

【讨论】:

  • 这就是我要找的,谢谢!
  • @Sheerforce 不客气!顺便说一句,请将答案标记为已接受,以便人们知道您已经解决了问题。
  • 我不得不等 10 分钟,我现在就做到了。
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2011-09-04
  • 1970-01-01
  • 2016-06-17
相关资源
最近更新 更多