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行目の謎を解明したいなー