node.js回调函数范围

时间:2017-11-08 20:52:42

标签: javascript asynchronous

我目前正在使用learnyounode进行练习,但我无法弄清楚为什么我的代码版本没有正确执行。

  1 'use strict';
  2 
  3 const fs = require('fs');
  4 
  5 
  6                                                                                     
  7 fs.readdir(process.argv[2], 'utf8', callback);
  8 
  9 var callback = function (err, files) {
 10     let ext = process.argv[3];
 11     files.forEach((val, idx) => {
 12         if (val.split('.')[1] == ext){
 13             console.log(val); 
 14         }
 15     });
 16 };

如果我只是在最后调用fs.readdir(...),它会执行,所以我知道它必须是异步/函数闭包类型的问题我不理解。有人可以解释为什么我上面的代码会抛出错误(node:23729) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

在致电callback时,

undefinedfs.readdir()。在此调用之上实例化它将起作用。

fs.readdir(process.argv[2], 'utf8', callback); // callback is undefined here
var callback = ...

这会有效:

var callback = ...
fs.readdir(process.argv[2], 'utf8', callback); // callback is now defined

使用Javascript hoisting这也有效:

fs.readdir(process.argv[2], 'utf8', callback);
function callback() {
  // do callback stuff
}

为什么Javascript吊装不能与var一起使用?

  

重要的是要指出提升将影响变量声明,但不会影响其值的初始化。达到赋值语句{@ 3}}

时,确实会赋值

这是什么意思?

这意味着当您提起var声明时,您只是"保留"范围内的变量,不运行任何代码来设置其值。由于javascript中的所有未实例化变量都默认为undefined值,因此这是callback变量的值。