对NodeJS模块开发的怀疑
Doubts about NodeJS Module Development
我正试图编写我的第一个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;
},
};
};
问题:
- 我在第一次迭代中是否正确调用了
count
?count: function (token) {}(tokens)
- 如何递归调用
count
方法?我得到一个"ReferenceError:计数未定义" - 这是用几种方法定义一个小模块的正确(或最佳实践)方法吗
请原谅我没有发布3个不同的问题,但我还不太熟悉所有的术语。
- 立即调用闭包的约定是
count: (function(args) {return function() {}})(args)
,但您的方法也适用于所有环境 - 你不能,因为计数很不幸是一个闭包——请参阅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;
};
相关文章:
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- Webpack开发服务器和React服务器端渲染
- 表达式引擎扩展开发-向呈现的条目添加自定义javascript
- JavaScript滚动脚本-在测试中激发,而不是在开发站点上
- webpack开发模式和生产构建模式之间有什么区别
- 开发第三方小部件-Angular vs jQuery vs普通的旧JS
- index.html使用webpack开发服务器未重新加载
- Chrome开发工具中使用了哪些框架和库
- 如何在Chrome中找到JSON后将其放入我的应用程序's开发人员工具
- 为第一次尝试Javascript的经验丰富的开发人员提供建议
- mozilla插件的开发
- `当使用箭头函数时,“开发工具”中未定义“this”
- Rally SDK外部开发Rally环境未定义
- 为什么firefox开发人员控制台引用script.js
- 如何使用Socket.io和Node.js开发大型聊天应用程序
- Javascript未在开发服务器上填充Perl表单
- 有没有一种方法可以使用任何浏览器扩展整个dom树'的开发工具
- $.get-response没有responseJSON方法,但当我在Chrome开发工具中绑定它时,它确实有
- Noob web开发人员希望添加web设计和交互
- 对NodeJS模块开发的怀疑