我目前正在使用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.
吗?
谢谢!
答案 0 :(得分:4)
callback
时, undefined
为fs.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
变量的值。