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