Eloquent Javascript第10章模块

时间:2017-08-11 18:04:39

标签: javascript module eloquent

我在模块章节的最后,但我真的不明白这段代码的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();
    }

2 个答案:

答案 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

myMod.onLoad.forEach(function(f) { f(); });

这里,function (f) { f(); };定义了一个匿名函数,其输入是另一个函数,并执行该(其他)函数。例如,如果您传递匿名函数console.log("hello")的输入,它将打印" hello"到控制台。

myMod.onLoad是一个设计在模块加载时运行的函数列表。 myMod.onLoad.forEach()是一种自动迭代所有这些函数的方法,并将它们提供给上面描述的匿名函数,该函数安排执行这些函数。

整体效果是该语句扫描myMod.onLoad中列出的所有函数,并执行它们。