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

时间:2016-03-31 09:43:48

标签: javascript callback async.js

以下是Trevor Burnham" Async JavaScript"的代码示例。书(The Pragmatic Bookshelf,2012):

"a"

这让我很困惑,为什么可以安排未申报的"回调"使用setTimeout的函数?代码在节点中执行OK,但它到底做了什么?是否呼叫"回调"真的安排在指定的时间点执行,他们真的执行了吗?

2 个答案:

答案 0 :(得分:1)

callback未被声明,它作为参数传递给匿名函数,就在这里:

function(callback) { setTimeout(callback, 100); }
         ^^^^^^^^               ^^^^^^^^
            |                      |
            +----------------------+

它是由实际执行匿名函数的人提供的。 The documentation for async.series说:

  

tasks - 包含要运行的函数的集合,每个函数都会传递callback(err, result) ,它必须在完成时调用,并显示错误err(可以是null)和可选的result值。

答案 1 :(得分:1)

... DECLARE vVersion varchar2(100); BEGIN /* get the version */ SELECT DISTINCT version into vVersion from PRODUCT_COMPONENT_VERSION; -- /* loop through users */ for i in ( select * from DBA_USERS_WITH_DEFPWD) loop /* print a different statement, based on vVersion, for the current user */ if ( vVersion = '12.1.0.2.0' ) then dbms_output.put_line('Alter user ' || i.username || ' identified by values ' || '''EE3FD1E715941451''' || ';'); else dbms_output.put_line('Alter user ' || i.username || ' identified by values ' || '''Invalid Password''' || ';'); end if; end loop; END; ... 已定义,但不在您的脚本中。它在callback模块的source代码中定义:

async

'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); } 模块定义一个函数,并将其作为async参数传递给每个串联函数。