Javascript作用域意外结果

Javascript Scope Unexpected Results

本文关键字:结果 意外 作用域 Javascript      更新时间:2023-09-26

我已经和这个问题斗争了几个小时,我在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创建的函数的父作用域声明,所以我可以为它赋值。有人能解释我做错了什么,以及访问作用域外变量的正确方法吗?

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

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

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

有关更深入的解释,请参阅本入门教程。