NodeJS:函数与匿名函数

zil*_*lla 3 javascript node.js

参与流式冒险 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();
  }
};
Run Code Online (Sandbox Code Playgroud)

这是建议的解决方案,其工作原理:

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();
  }
};
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解使用保存到变量中的匿名函数与仅命名函数之间的区别吗?

JLR*_*she 10

不同之处在于悬挂.当您使用函数声明语句(即在提议的解决方案中使用了什么)时,它的定义被"提升"到包含它的范围(读取:函数)的顶部,因此即使您尝试在它之前引用它定义它的代码,它将可用.

您正在使用变量赋值来定义函数.这意味着writevar 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);
};
Run Code Online (Sandbox Code Playgroud)

nb不要将函数声明语句命名函数表达式混淆.命名函数表达式是无关的,就像匿名函数一样:

var boom = getNumber();
var getNumber = function getNumber() { return 3; };
Run Code Online (Sandbox Code Playgroud)