Javascript 为什么可以将未声明的函数传递给setTimeout

Javascript 为什么可以将未声明的函数传递给setTimeout,javascript,callback,async.js,Javascript,Callback,Async.js,下面是Trevor Burnham的《异步JavaScript》一书(实用书架,2012)中的代码示例: 这让我很困惑,为什么可以使用setTimeout来调度未声明的“回调”函数?代码在节点中执行OK,但它具体做什么?“回调”调用是否真的计划在指定的时间点执行,它们是否真的执行了?callback不是未声明的,它作为参数传递到匿名函数中,就在这里: function(callback) { setTimeout(callback, 100); } ^^^^^^^^

下面是Trevor Burnham的《异步JavaScript》一书(实用书架,2012)中的代码示例:


这让我很困惑,为什么可以使用setTimeout来调度未声明的“回调”函数?代码在节点中执行OK,但它具体做什么?“回调”调用是否真的计划在指定的时间点执行,它们是否真的执行了?

callback
不是未声明的,它作为参数传递到匿名函数中,就在这里:

function(callback) { setTimeout(callback, 100); }
         ^^^^^^^^               ^^^^^^^^
            |                      |
            +----------------------+
它由实际执行匿名函数的人提供。说:

任务
-包含要运行的函数的集合,每个函数都传递一个
回调(err,result)
它必须在完成时调用一个错误
err
(可以是
null
)和一个可选的
结果


回调已定义,但未在脚本中定义。它在
async
模块的代码中定义:

“严格使用”;
导出默认功能(任务){
函数makeCallback(索引){
函数fn(){
if(tasks.length){
任务[索引]。应用(空,参数);
}
返回fn.next();
}
fn.next=函数(){
return(index

async
模块定义一个函数,并将其作为
回调
参数传递给系列中的每个函数。

那么,什么呢<代码>异步
系列
?是,异步.series。以下是文档:()。呃,
回调
在这些函数中都明确声明为参数?我相信您的答案非常接近事实,但我没有看到makeCallback()返回的函数中解析的参数。根据文档,回调函数必须将其第一个参数(错误)传递给async.series()的“completionCallback”参数,或者传递给下一个任务执行。
function(callback) { setTimeout(callback, 100); }
         ^^^^^^^^               ^^^^^^^^
            |                      |
            +----------------------+
'use strict';

export default function(tasks) {
    function makeCallback(index) {
        function fn() {
            if (tasks.length) {
                tasks[index].apply(null, arguments);
            }
            return fn.next();
        }
        fn.next = function() {
            return (index < tasks.length - 1) ? makeCallback(index + 1) : null;
        };
        return fn;
    }
    return makeCallback(0);
}