JavaScript動的スクリプトローディングの履歴

http://d.hatena.ne.jp/amachang/20071116/1195202294

var load = function(src, check, next) {
  check = new Function('return !!(' + check + ')');
  if (!check()) {
    var script = document.createElement('script')
    script.src = src;
    document.body.appendChild(script);
    setTimeout(function() {
      if (!check()) setTimeout(arguments.callee, 100);
      else next();
    }, 100);
  }
  else next();
};

load('hoge.js', 'isLoaded', function(){
  ...
});


これすごいな。何回も書くけどamachang天才だと思う

解読する

2行目からしてわけわから

  check = new Function('return !!(' + check + ')');

checkの中身をそのままコード化するということかな。

でもなで function(){} じゃなくて、new Function() なのか。typeof(x) == 'undefined'じゃなくて !! なのか。以前調べた気がするけど、忘れたなー。


ロードが完了するまでループする処理

    setTimeout(function() {
      if (!check()) setTimeout(arguments.callee, 100);
      else next();
    }, 100);

arguments.callee は呼び出した関数が入る。ということは

    function() {
      if (!check()) setTimeout(arguments.callee, 100);
      else next();
    }

この部分がそのまま入るということか。匿名関数で再帰してるのか。このパターンは見たことがる。JavaScriptすごい。

このロード完了を待つ処理は他でも応用できそうだな。こういうの「Waitパターン」とかいって、デザインパターン化したいね。

あと2行目の謎を解明したいなー