我在使用NodeJS构建的应用程序中工作。我正在使用模块,到目前为止这是我的代码:
代码:PROGRAM.JS
var path = process.argv[2];
var ext = '.' + process.argv[3];
var prsFiles = require('./fpmod');
function callback(err, files) {
if(!err) {
success(ext, files);
} else {
throw ('uhoh there was an error! :/');
}
}
prsFiles.process(path, ext, callback);
代码:FPMOD.JS
var fs = require('fs');
var pathMod = require('path');
var i = 0;
function success(ext, files) {
for(i; i < files.length; i++) {
// console.log('File comes in as: ' + files[i] + ' and we\'re filtering on .' + ext);
var currentFile = files[i];
var currentFileExt = pathMod.extname(currentFile);
// console.log('grabbed ext is: ' + currentFileExt);
if(ext) {
if(ext === currentFileExt) {
console.log(currentFile);
}
} else {
console.log(currentFile);
}
}
}
function processFiles(path, ext, callback) {
var success = success;
fs.readdir(path, callback);
}
exports.process = processFiles;
我得到的错误说明成功功能未定义。这是为什么?如果我对函数范围的理解是正确的,它应该可以访问成功函数!我错了什么?
答案 0 :(得分:2)
JavaScript中的范围是词汇。重要的是在定义函数时函数中代码可见的符号集。我认为在定义重要的地方说它是范围的集合更为准确。函数范围是(delete
除外,它在严格模式下是奇怪的和不允许的)根据它们导出的符号集是不可变的,但是全局范围不是。模块范围就像功能范围一样(我认为;我承认不是节点专家。)然而,全球范围在这里并不是真的有问题,因为你正在使用模块。
你的&#34;回调&#34;在主模块中定义的函数不能访问名为&#34; success&#34;在它定义的那一点上。事实上,另一个模块中的函数有一个名为&#34;成功&#34;的本地符号。无法帮助 - 这个符号完全不同于&#34;回调&#34;功能。这不是你在JavaScript中可以做的事情。
请记住,在Node环境中,模块中未导出的符号实际上是该模块的私有符号。
答案 1 :(得分:1)
您没有导出success
功能。
您希望它出现在第一个片段中,即使您没有采取任何措施使其可用。你可以这样做:
module.exports = {
processFiles: processFiles,
success: success
};
然后使用它
var prsFiles = require('./fpmod');
function callback(err, files) {
if(!err) {
prsFiles.success(ext, files);
} else {
throw ('uhoh there was an error! :/');
}
}