函数范围问题-函数未定义

Issue with function scope - function is undefined

本文关键字:函数 未定义 问题 范围      更新时间:2023-09-26

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

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

JavaScript中的作用域是词法的。重要的是在定义函数时,函数中代码可见的符号集。我想更准确的说法是,在定义点上,重要的是作用域的集合。函数作用域(delete除外,这很奇怪,在严格模式下是不允许的)就其导出的符号集而言是不可变的,但全局作用域不是。模块作用域的工作原理类似于函数作用域(我认为;我承认自己不是节点专家。)然而,全局作用域在这里并不是真正的问题,因为您使用的是模块。

在主模块中定义的"回调"函数在定义时不能访问名为"成功"的符号。另一个模块中的函数有一个名为"success"的本地符号,这一事实于事无补——该符号与"callback"函数完全不同。这不是用JavaScript可以做到的。

请记住,在Node环境中,模块中未导出的符号实际上是该模块的私有符号。

您没有导出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! :/');
  }
}