javascript中无参数的回调

javascript中无参数的回调,javascript,node.js,function,callback,Javascript,Node.js,Function,Callback,我有一个带有回调的nodejs代码,我无法理解它是如何工作的。有人能解释一下吗 function readJSONIntoArray(directory, array, callback) { var ending = 'json'; fs.readdir(directory, function (err, files) { if (err) throw err; var fileCnt = files.lengt

我有一个带有回调的nodejs代码,我无法理解它是如何工作的。有人能解释一下吗

function readJSONIntoArray(directory, array, callback) 
{
    var ending = 'json';
    fs.readdir(directory, function (err, files) 
    {
        if (err)
           throw err;
        var fileCnt = files.length;
        files.forEach(function (file) 
        {
            if (endsWith(file, '.' + ending)) 
            {
                file = file.substring(0, file.length - (ending.length + 1));
                var fileContent = require(path.join(directory, file));
                array.push(fileContent);
                log.info('Read file: ' + file);
            }
            fileCnt--;
            if (fileCnt === 0 && typeof callback === 'function') 
            {
                callback();
            }
        });
    });
}
这里的回调是空的,所以我猜没有返回值。但在实际输出中,返回数组。我不明白空回调可以返回数组

函数调用:
readJSONIntoArray(profilefolder、profiles、setProfileDescriptions)

setProfileDescriptions的定义是单独的

function setProfileDescriptions() 
{
    profiles = bubblesort(profiles, 'order');
}
setProfileDescriptions
中,配置文件数组由read函数中读取的文件中的json数据填充。 有人能解释一下如何将
readJSONIntoArray
函数调用中的第三个参数识别为函数并返回数组配置文件吗

var globalArray=[];
function readFunction(path,globalArray,callbackFunction){
    globalArray.push(path);
    callbackFunction();
}
function callbackFunction(){
    //globalArray was global so i can call here
    console.log(globalArray);
}

readFunction('filePath',globalArray,callbackFunction);
考虑上面的代码,因为声明为全局的“globalArray”可以在回调函数中访问


考虑上面的代码,因为声明为全局的“globalArray”可以在回调函数中访问

您是对的,
readJSONIntoArray
在它的
回调
中不返回任何内容。相反,它将新数据附加到第二个参数
数组
,从而对其进行变异

因此,
readJSONIntoArray
的使用方式如下:

var content = []; // empty array to accumulate data from readJSONIntoArray function
readJSONIntoArray('some directory', content, function () {
  // content is full of data now
  doSomething(content);
});
尽管我必须指出,这不是node.js中常见的模式,应该避免,因为它太令人困惑了

事实上,在
readJSONIntoArray
实现中有几件事做得不对:

  • 函数不应该改变它们的参数
  • 异步函数不应该
    抛出
    错误,而是应该在
    回调中返回它们
    
  • 函数生成的任何数据也应在
    回调中返回

您是对的,
readJSONIntoArray
在其
回调中不返回任何内容。相反,它将新数据附加到第二个参数
数组
,从而对其进行变异

因此,
readJSONIntoArray
的使用方式如下:

var content = []; // empty array to accumulate data from readJSONIntoArray function
readJSONIntoArray('some directory', content, function () {
  // content is full of data now
  doSomething(content);
});
尽管我必须指出,这不是node.js中常见的模式,应该避免,因为它太令人困惑了

事实上,在
readJSONIntoArray
实现中有几件事做得不对:

  • 函数不应该改变它们的参数
  • 异步函数不应该
    抛出
    错误,而是应该在
    回调中返回它们
    
  • 函数生成的任何数据也应在
    回调中返回

配置文件未作为参数提供给
setProfileDescription
。但是,如果您可以访问该变量,则该变量可能是全局变量。profiles未作为参数提供给
setProfileDescription
。但是,该变量可能是全局变量,如果这样,您可以访问它。在您的示例中,
globalArray
readFunction
的参数,而不是全局变量。但我首先声明globalArray。因此,它应该被视为全局变量“右”?“否”,在“代码>读取函数< /代码>的内部,它被局部变量所遮蔽。因此,您的“全局”
globalArray
不会受到
readFunction
的影响,除非它作为参数传递。在您的示例中,在
readFunction
之前声明它完全不起任何作用。因此,如果它被作为局部变量的“readFunction”隐藏。那么我应该无法将“globalArray”值记录到console right?中?。但是我可以记录值,如果您在
callbackFunction
中引用
console.log
,那么您将记录“global”
globalArray
,因为它没有阴影。对于
readFunction
,您在那里作为参数传递完全相同的
globalArray
,但在函数内部您仍然在处理局部变量。这正是您调用
readFunction
的方式,使其成为与“global”
globalArray
完全相同的数组。在您的示例中,
globalArray
readFunction
的参数,而不是全局变量。但我首先声明globalArray。因此,它应该被视为全局变量“右”?“否”,在“代码>读取函数< /代码>的内部,它被局部变量所遮蔽。因此,您的“全局”
globalArray
不会受到
readFunction
的影响,除非它作为参数传递。在您的示例中,在
readFunction
之前声明它完全不起任何作用。因此,如果它被作为局部变量的“readFunction”隐藏。那么我应该无法将“globalArray”值记录到console right?中?。但是我可以记录值,如果您在
callbackFunction
中引用
console.log
,那么您将记录“global”
globalArray
,因为它没有阴影。对于
readFunction
,您在那里作为参数传递完全相同的
globalArray
,但在函数内部您仍然在处理局部变量。这正是您调用
readFunction
的方式,使其成为与“global”
globalArray
完全相同的数组。