功能范围问题 - 功能未定义

时间:2014-09-09 12:33:52

标签: javascript node.js

我在使用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;

我得到的错误说明成功功能未定义。这是为什么?如果我对函数范围的理解是正确的,它应该可以访问成功函数!我错了什么?

2 个答案:

答案 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! :/');
  }
}