我想了解this code,但我在理解某些出口时遇到了问题。
导出函数是明确的,但如果您在createMonitor函数(导出)中查找示例,您将看到导出到watchTree调用。
exports.createMonitor = function (root, options, cb) {
if (!cb) {cb = options; options = {}}
var monitor = new events.EventEmitter();
monitor.stop = exports.unwatchTree.bind(null, root);
var prevFile = {file: null,action: null,stat: null};
exports.watchTree(root, options, function (f, curr, prev) {}
}
如果查看代码,函数的定义也会在上面导出。 我唯一可以想到的是,因为在这个函数里面有一些发射事件,它们被导出为模块发出事件,但我没有在文档中看到任何类似的东西。
任何见解?
答案 0 :(得分:0)
watchTree
和unwatchTree
函数实际上是在同一模块中导出的。但由于它们不是独立的功能,因此无法直接引用它们。为了避免使用这种“导出引用”方案,您可以重写以下函数:
function watchTree(...) { /* function body */}
function unwatchTree(...) { /* function body */}
function createMonitor = function (root, options, cb) {
if (!cb) {cb = options; options = {}}
var monitor = new events.EventEmitter();
monitor.stop = unwatchTree.bind(null, root);
var prevFile = {file: null,action: null,stat: null};
watchTree(root, options, function (f, curr, prev) {}
}
然后将它们分配给exports
对象:
exports.watchTree = watchTree;
exports.unwatchTree = unwatchTree;
exports.createMonitor = createMonitor;
我认为这种情况更好,让你的代码更具可读性,所以没有人会对它的工作方式感到困惑,比如你:)
答案 1 :(得分:0)
这只是一个可读性问题,实际上没有任何内容在createMonitor
函数中导出。
// bind the `unwatchTree` method to the `monitor.stop` property
monitor.stop = exports.unwatchTree.bind(null, root);
...
// invoke the `watchTree` method
exports.watchTree(root, options, function(f, curr, prev) {};
如果您查看createMonitor
方法的上方,您会看到导出unwatchTree
/ watchTree
,因此引用它们的唯一方法是通过exports
对象。