您不需要的javascript模块模式';我不知道JS

您不需要的javascript模块模式';我不知道JS,javascript,module,callback,Javascript,Module,Callback,我已经阅读和测试下面的代码好几个小时了,我似乎无法掌握某些东西。 我一直在浏览chrome控制台,基本上我可以添加的每一行都有中断,我一直在检查,我只是不确定 1) 我只是不确定deps阵列的用途。对我来说,第一件奇怪的事情是,为什么脚本不尝试将数据放在对它的第一次调用中(从MyModules.define(“bar”,[],function())? 为什么脚本第二次调用define(MyModules.define(“foo”、[“bar”]、function(bar)),然后在第一次定义时将

我已经阅读和测试下面的代码好几个小时了,我似乎无法掌握某些东西。 我一直在浏览chrome控制台,基本上我可以添加的每一行都有中断,我一直在检查,我只是不确定

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

2) 这段代码
modules[name]=impl.apply(impl,deps)
。每次回调都不使用“This”…所以这里apply是必要的吗?另外,这可能是我在使用“apply”时对回调缺乏理解,但人们是如何理解的?我想“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();
var MyModules=(函数管理器(){
var模块={};
函数定义(名称、deps、impl){
对于(var i=0;i
我只是不确定
deps
array的用途

您似乎对整个
MyModules
对象的用途感到困惑,不是吗

define
方法可用于声明具有名称、依赖项数组和工厂函数的模块:

  • name
    是将模块对象存储在该
    modules
    字典中的字符串
  • deps
    数组包含当前声明的模块所依赖的模块的名称
  • 将调用
    impl
    函数来创建在
    name
    下可用的模块对象。它会传递
    deps
    数组中的名称解析到的模块对象
为什么脚本不尝试将数据放在第一次调用时(从
MyModules.define(“bar”),[],function()
)?为什么脚本要第二次调用define(
MyModules.define(“foo”),[“bar”],function(bar)

这意味着声明一个名为
bar
且没有任何依赖项的模块,以及声明一个名为
foo
且依赖于
bar
的模块。通常,这两个声明将放在不同的脚本中

此代码
modules[name]=impl.apply(impl,deps)
-每个回调都不使用“This”…因此这里需要应用吗

是的,在这里向函数传递任意多个参数是必需的。但是,为
this
值传递
impl
函数确实没有任何意义,
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);
}
函数定义(moduleName、DependencyName、factory){
var相关性=[];

对于(var i=0;iWhoa,这真是令人困惑,它将模块模式与模块的依赖关系管理系统混合在一起…我需要更多的时间来研究这一点。这对我来说很难理解。例如,我仍然不理解为什么函数定义不能只做模块[name]=impl.apply(impl,deps)??将内容填充到deps[]似乎没有必要..没有?@user3502374:看看它在里面装了什么。我重写的代码段实际上为此目的使用了两个数组,这可能会进一步说明这一点。我想我明白了..我查看了您的代码,也查看了第二个MyModules.define,我替换了bar w/barX(其中两个),并验证代码是否运行相同(因此,我假设依赖关系,意味着第二个MyModules.define运行时使用'this'作为'bar')。我仍然不理解为了实现这一点而进行的代码卷积的意义(假设这背后有一点我还没有意识到)。我需要进一步研究这个问题,使其成为我的问题,但我确实非常感谢您的帮助!。谢谢。“但是,将impl函数传递给this值确实没有任何意义,null在这里更合适。”这不是一个错误,这是故意的。我希望该定义中的
this
调用是可预测的,无论它们是否处于严格模式。在非严格模式下,传递
null
意味着
this
指向全局,这是不好的。我将
this
绑定到函数对象本身,以便以可预测的方式包含(防止逃脱)任何错误的
作业。我没想到读者会挖掘这些细微差别。这是我的错误。我会在本书的未来版本中更加小心更新。:)