对NodeJS模块开发的怀疑

我试图编写我的第一个NodeJS模块,但是我很难理解一些概念。

这是我现在的代码(一个genexer计数器/发生器):

"use strict"; var ret = require('ret'); module.exports = function (regex) { if (Object.prototype.toString.call(regex) === '[object RegExp]') { regex = regex.source; } else if (typeof regex !== 'string') { regex = String(regex); } try { var tokens = ret(regex); } catch (exception) { return false; } return { charset: '', reference: [], count: function (token) { var result = 0; if ((token.type === ret.types.ROOT) || (token.type === ret.types.GROUP)) { if (token.hasOwnProperty('stack') === true) { result = 1; token.stack.forEach(function (node) { result *= count(node); }); } else if (token.hasOwnProperty('options') === true) { var options = []; token.options.forEach(function (stack, i) { options[i] = 1; stack.forEach(function (node) { options[i] *= count(node); }); }); options.forEach(function (option) { result += option; }); } if ((token.type === ret.types.GROUP) && (token.remember === true)) { reference.push(token); } } else if (token.type === ret.types.POSITION) { } else if (token.type === ret.types.SET) { token.set.forEach(function (node) { if (token.not === true) { if ((node.type === ret.types.CHAR) && (node.value === 10)) { } } result += count(node); }); } else if (token.type === ret.types.RANGE) { result = (token.to - token.from + 1); } else if (token.type === ret.types.REPETITION) { if (isFinite(token.max) !== true) { return Infinity; } token.value = count(token.value); for (var i = token.min; i <= token.max; ++i) { result += Math.pow(token.value, i); } } else if (token.type === ret.types.REFERENCE) { if (reference.hasOwnProperty(token.value - 1) === true) { result = 1; } } else if (token.type === ret.types.CHAR) { result = 1; } return result; }(tokens), generate: function () { return false; }, }; }; 

问题:

  1. 我是否在第一次迭代中正确countcount: function (token) {}(tokens)
  2. 我怎么可以recursion调用count方法? 我得到一个“ReferenceError:计数没有定义”
  3. 这是用几种方法定义一个小模块的正确(或最佳实践)方法吗?

原谅我没有发表3个不同的问题,但我还不是很熟悉所有的术语。

  1. 立即调用闭包的约定是count: (function(args) {return function() {}})(args)但你的方式也适用于所有环境。
  2. 你不能,因为计数是一个封闭不幸的 – 见3。
  3. 如果你想在你的模块中的模块上使用方法,我会在return语句之外声明模块。 如果你想要一个很好的例子,请参阅下划线 / lodash源代码。

所以你可以使用像下面的框架一样的声明来定义你的模块

 module.exports = function (regex) { //... var count = function(tokens) { //... return function() { //... var ret *= count(node); return ret; } } var mymod = { count: count(tokens) //... }; //... return mymod; };