延續(同步和非同步)

回撥可用於提供方法完成後要執行的程式碼:

/**
 * @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 直譯器優化