了解嵌套回调和范围?

时间:2018-03-03 16:19:36

标签: javascript node.js callback

据我所知,有很多关于回调的文档和课程。我已经阅读了很多这些资源,但对于这个特殊的问题,我不明白发生了什么。并且,我认为帮助解决这个特殊问题将有助于我更好地理解回调。

简而言之,我不明白为什么我可以访问'分机?在主要的一部分'readFile()'函数,但我无法将其传递给该函数中的函数,即< filterData()'功能

感谢您帮助我理解这一点。

const fs = require("fs");
const path = require("path");

const dir1 = process.argv[2];
const fileType = process.argv[3];  
const whenDone = function(err, data) {
  if(err) {
    console.log(err);
  } else {
  for(i = 0; i < data.length - 1; i++) {
    console.log(data[i]);
    }
  }
}

let arr = [];


function readFile(dirName, ext, callback) {
  fs.readdir(dirName, function (err, data) {
    if (err) {
      return callback(err, null);
    }
      // ext and data are defined here:
      console.log(ext, data);
      function filterData(ext) {
        // ext and data are not defined here?
        console.log(ext, data);
        return data.filter(function(files) {
          return arr = files.includes(ext);
          console.log(arr);
        });
        return callback(null, arr);
      }
  });
}




readFile(dir1, fileType, whenDone);

2 个答案:

答案 0 :(得分:1)

您正在嵌套函数中定义参数名称ext,它会影响较高范围ext参数。因此,您可以将其更改为其他内容,并且您将具有较高范围ext param访问权限。

答案 1 :(得分:1)

原因是在嵌套函数(filterData)中,您声明了一个参数(本质上是一个局部变量),其名称(ext)已经存在于更高的范围内({{ 1}}),因此,在readFile函数的持续时间内,filterData指的是传递给它的内容,而不是传递给ext的{​​{1}}。这称为"hiding" or "shadowing",当较小的作用域声明已在较高作用域中声明的标识符时发生。

我已经写过 here

如果您只是更改嵌套函数的参数名称,并确保在嵌套函数中引用这些参数名称,它将起作用:

ext

这是一个简单的例子:

&#13;
&#13;
readFile
&#13;
&#13;
&#13;