使用stream-adventure NodeJS教程,但我正在努力使用双工器redux练习。
这是我尝试过的,但它不起作用:
var duplexer = require('duplexer2');
var through = require('through2').obj;
module.exports = function (counter) {
var counts = {};
var input = through(write, end);
return duplexer(input, counter);
var write = function (row, _, next) {
counts[row.country] = (counts[row.country] || 0) + 1;
next();
}
var end = function (done) {
counter.setCounts(counts);
done();
}
};
这是建议的解决方案,有效:
var duplexer = require('duplexer2');
var through = require('through2').obj;
module.exports = function (counter) {
var counts = {};
var input = through(write, end);
return duplexer(input, counter);
function write (row, _, next) {
counts[row.country] = (counts[row.country] || 0) + 1;
next();
}
function end (done) {
counter.setCounts(counts);
done();
}
};
有人可以帮助我理解使用保存到变量中的匿名函数与仅命名函数之间的区别吗?
答案 0 :(得分:10)
差异是hoisting。当您使用函数声明语句(即在提议的解决方案中使用了什么)时,its definition is "hoisted"到包含它的范围顶部(读取:函数),因此即使您尝试引用在定义它的代码之前,它将可用。
您正在使用变量分配来定义您的功能。这意味着write
在执行var write =
语句之前不会有值。在write
仍具有值undefined
时,您之前尝试使用它。
这意味着您只需移动定义功能的位置即可让代码正常工作:
module.exports = function (counter) {
var counts = {};
var write = function (row, _, next) {
counts[row.country] = (counts[row.country] || 0) + 1;
next();
};
var end = function (done) {
counter.setCounts(counts);
done();
};
var input = through(write, end);
return duplexer(input, counter);
};
n.b。不要将函数声明语句与named function expressions混淆。 命名函数表达式是无关的,就像匿名函数一样:
var boom = getNumber();
var getNumber = function getNumber() { return 3; };