我已经阅读和测试了下面的代码几个小时了,我似乎无法掌握某些内容。
我一直在逐步浏览chrome控制台,基本上在我可以添加并检查的每一行中都放置了中断,但我不确定

1)我只是不确定deps数组的目的。对我来说,第一件奇怪的事是,为什么脚本不尝试在首次调用数据时(来自MyModules.define("bar",[],function())放入数据?
为什么脚本首先调用define(MyModules.define("foo",["bar"], function(bar)),然后在首次定义时首先将[“bar”]添加到数组中?

2)此代码modules[name] = impl.apply(impl,deps)。每个回调,请不要使用“this” ..是否在此需要应用?另外,这可能是我在使用“apply”时对回调的缺乏理解,但是如何读懂呢?我以为“申请”通常会
functionName.apply(obj,[])
在这种情况下,这几乎就像是在说
functionName.apply(functionName, []) ??还是因为函数本身是匿名的而有所不同?

    var MyModules = (function Manager() {
        var modules = {};

        function define(name,deps,impl) {
            for ( var i=0; i<deps.length; i++) {
                deps[i] = modules[deps[i]];
            }
            modules[name] = impl.apply(impl,deps);
        }

        function get(name) {
            return modules[name];
        }

        return {
            define : define,
            get: get
        };
    })();

    MyModules.define("bar",[],function() {
        function hello(who) {
            return "Let me introduce: " + who;
        }

        return {
            hello : hello
        };
    })

    MyModules.define("foo",["bar"], function(bar) {
        var hungry = "hippo";

        function awesome() {
            console.log(bar.hello(hungry).toUpperCase() );
        }

        return {
            awesome: awesome
        };
    });

    var bar = MyModules.get("bar");
    var foo = MyModules.get("foo");

    console.log(bar.hello("hippo"));

    foo.awesome();

最佳答案



您似乎对整个MyModules对象的目的感到困惑,不是吗?
define方法可用于声明一个模块,一个名称,一个依赖项数组和一个工厂函数:

  • name是将模块对象存储在该modules词典中的字符串
  • deps数组包含当前声明的模块所依赖的模块的名称。
  • 将调用impl函数来创建模块对象,该对象将在name下可用。它确实传递了将deps数组中的名称解析为的模块对象。



  • 这意味着声明一个名称为bar的模块而没有任何依赖关系,并声明一个名称为foo的模块,该模块依赖于bar。通常,这两个声明将放置在不同的脚本中。



    是的,这里 apply 是向函数传递任意多个参数所必需的。但是,为impl值传递this函数确实没有任何意义,这里null会更合适。

    更好,更易理解的定义是
    function define(moduleName, dependencyNames, factory) {
        var dependencies = [];
        for (var i=0; i<dependencyNames.length; i++) {
            dependencies[i] = get(dependencyNames[i]); // resolve name
        }
        modules[moduleName] = factory.apply(null, dependencies);
    }
    

    关于您不懂JS的javascript模块模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31332645/

    10-17 02:36