延续(同步和异步)

回调可用于提供方法完成后要执行的代码:

/**
 * @arg {Function} then continuation callback
 */
function doSomething(then) {
  console.log('Doing something');
  then();
}

// Do something, then execute callback to log 'done'
doSomething(function () {
  console.log('Done');
});

console.log('Doing something else');

// Outputs:
//   "Doing something"
//   "Done"
//   "Doing something else"

上面的 doSomething() 方法与回调同步执行 - 执行块直到 doSomething() 返回,确保在解释器移动之前执行回调。

回调也可用于异步执行代码:

doSomethingAsync(then) {
  setTimeout(then, 1000);
  console.log('Doing something asynchronously');
}

doSomethingAsync(function() {
  console.log('Done');
});

console.log('Doing something else');

// Outputs:
//   "Doing something asynchronously"
//   "Doing something else"
//   "Done"

then 回调被认为是 doSomething() 方法的延续。提供回调作为函数中的最后一条指令称为尾调用由 ES2015 解释器优化