我在模块章节的最后,但我真的不明白这段代码的whenDepsLoaded()部分。有人可以帮我解释一下吗?
例如,这行是做什么的?
if(!deps.every(function(m){return m.loaded;})) 返回;
这一行?
myMod.onLoad.forEach(function(f){f();});
var defineCache = Object.create(null);
var currentMod = null;
function getModule(name) {
if (name in defineCache)
return defineCache[name];
var module = {exports: null,
loaded: false,
onLoad: []};
defineCache[name] = module;
backgroundReadFile(name, function(code) {
currentMod = module;
new Function("", code)();
});
return module;
}
function define(depNames, moduleFunction) {
var myMod = currentMod;
var deps = depNames.map(getModule);
deps.forEach(function(mod) {
if (!mod.loaded)
mod.onLoad.push(whenDepsLoaded);
});
function whenDepsLoaded() {
if (!deps.every(function(m) { return m.loaded; }))
return;
var args = deps.map(function(m) { return m.exports; });
var exports = moduleFunction.apply(null, args);
if (myMod) {
myMod.exports = exports;
myMod.loaded = true;
myMod.onLoad.forEach(function(f) { f(); });
}
}
whenDepsLoaded();
}
答案 0 :(得分:0)
例如,这行是做什么的?
if (!deps.every(function(m) { return m.loaded; })) return;
它检查是否至少有一个尚未加载的依赖项。
Array.prototype.every()基本上遍历整个数组并调用" test"你传递给它的功能。在此示例中,它检查对象是否将loaded
属性设置为truthy值。但是因为every
调用存在否定,这意味着如果不已经加载了每个依赖项,它将从函数返回。
这一行?
myMod.onLoad.forEach(function(f) { f(); });
由于mod.onLoad
包含一个函数数组,它只是逐个调用这些函数。
您应该查看Array.prototype.forEach()
文档。
答案 1 :(得分:0)
从令人费解的声明内部开始向外工作。这样,每个阶段都没有什么可考虑的。
if (!deps.every(function(m) { return m.loaded; })) return;
最里面的部分是function(m) { return m.loaded; }
。这是一个函数,它接受一个对象并返回其加载的#34;财产,即它是否已装载。
.every
函数接受一个数组,只有当数组中的所有元素都通过括号内的测试时才会回答true。
因此,deps.every( ..... )
获取deps
数组并测试其所有元素,以便存在" .loaded"财产是真的。如果所有这些都是真的,这意味着实际上所有dep [endencie]都被加载,那么deps.every...
就是真的。
通过对!deps.every
进行if语句测试,该语句正在查看是否未加载任何deps,如果是,则整个函数在该阶段返回。
myMod.onLoad.forEach(function(f) { f(); });
这里,function (f) { f(); };
定义了一个匿名函数,其输入是另一个函数,并执行该(其他)函数。例如,如果您传递匿名函数console.log("hello")
的输入,它将打印" hello"到控制台。
myMod.onLoad
是一个设计在模块加载时运行的函数列表。 myMod.onLoad.forEach()
是一种自动迭代所有这些函数的方法,并将它们提供给上面描述的匿名函数,该函数安排执行这些函数。
整体效果是该语句扫描myMod.onLoad中列出的所有函数,并执行它们。