var startIndex = 0;
    var data = [1, 2, 3];
    var timeout = 1000;
    function functionToRun(i, length) {
      alert(data[i]);
    }
    (function forWithDelay(i, length, fn, delay) {
      setTimeout(function() {
        fn(i, length);
        i++;
        if (i < length) {
          forWithDelay(i, length, fn, delay);
        }
      }, delay);
    })(startIndex, data.length, functionToRun, timeout);
 
 
関数をより再利用しやすくするために変数がパラメーターに抽出されたDaniel Vassalloの回答の修正バージョン:
まず、いくつかの重要な変数を定義しましょう:
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 3000;
次に、実行する関数を定義する必要があります。これには、必要に応じて、i、ループの現在のインデックス、およびループの長さが渡されます。
function functionToRun(i, length) {
    alert(data[i]);
}
自己実行バージョン
(function forWithDelay(i, length, fn, delay) {
   setTimeout(function () {
      fn(i, length);
      i++;
      if (i < length) {
         forWithDelay(i, length, fn, delay); 
      }
  }, delay);
})(startIndex, data.length, functionToRun, timeout);
機能バージョン
function forWithDelay(i, length, fn, delay) {
   setTimeout(function () {
      fn(i, length);
      i++;
      if (i < length) {
         forWithDelay(i, length, fn, delay); 
      }
  }, delay);
}
forWithDelay(startIndex, data.length, functionToRun, timeout); // Lets run it