虚拟机,编译原理,应用框架

javascript: LoadModule, LoadModules

注意这里使用Function来避免eval的可见域问题。


function loadModule(/*Module*/mod/*location*//*Function*/cb/*callback*/) {
    
var ajax = new XMLHttpRequest();
    ajax.onreadystatechange 
= function(cb){
        
return function(){
            
if (this.readyState == 4 && this.status == 200) {
                (
new Function(this.responseText)).apply(window);
                cb();
                mod.loaded 
= true;
            }
        }
    } (cb);
    ajax.open(
'POST', mod.location, true);
    ajax.send(
null);
}

function loadModules (/*Array<Module>*/mods/*locations*//*Function*/cb/*callback*/) {
    
if (mods && mods.length <= 0) {
        cb();
        
return;
    }
    
var mod = mods.shift();
    loadModule(mod, mods.length 
<= 0 ? cb : function() {
        loadModules(mods, cb);
    });
}

function LoadModules(/*Array<Module>*/mods, /*Function*/cb/*callback*/) {
    
var toLoad = [];
    
function ToLoad(mod) {
        
if (mod.loaded) return;
        
if (mod.reference instanceof Array) {
            
for (var i = 0; i < mod.reference.length; i ++) {
                
if (!(mod.reference[i].loading || mod.loaded)) {
                    ToLoad(mod.reference[i]);
                }
            }
        }
        toLoad.push(mod);
        mod.loading 
= true;
    }
    
for (var i = 0; i < mods.length; i++) {
        ToLoad(mods[i]);
    }
    loadModules(toLoad, cb);
}

posted on 2008-07-28 22:43  文宇祥  阅读(1041)  评论(0编辑  收藏  举报

导航