javascript模块模式来自你不了解JS

时间:2015-07-10 04:46:51

标签: javascript module callback

我已经在下面的代码中阅读和测试了几个小时了,我似乎无法掌握某些事情。 我一直在逐步完成镀铬控制台,基本上我可以添加的每一行都有突破并且一直在检查,我只是不确定事情

1)我只是不确定deps数组的目的。对我来说,第一件奇怪的事情是,为什么没有脚本尝试将数据放在第一次调用它(来自@JsonProperty("first_Name") String first_Name; @JsonProperty("last_Name") String first_Name; )?   为什么脚本第二次调用MyModules.define("bar",[],function())然后在第一次定义应该首先完成它时将[" bar"]添加到数组中?

2)此代码define(MyModules.define("foo",["bar"], function(bar)。每次回调,都不要使用'这样需要在这里申请吗?此外,这可能是我在回调时缺乏理解,当他们申请'使用,但如何阅读这个?我以为'申请'通常会          modules[name] = impl.apply(impl,deps)

在这种情况下,这几乎就像说       functionName.apply(obj,[]) 或者这是不同的,因为函数本身是匿名的?

functionName.apply(functionName, []) ??

1 个答案:

答案 0 :(得分:8)

  

我只是不确定deps数组的目的。

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

define方法可用于声明模块,包含名称,依赖项数组和工厂函数:

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

为什么没有脚本尝试在第一次调用时放入数据(来自MyModules.define("bar",[],function())?为什么脚本会进行第二次调用来定义(MyModules.define("foo",["bar"], function(bar))?

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

  

此代码modules[name] = impl.apply(impl,deps) - 每次回调,都不要使用'这样在这里需要申请吗?

是的,这里需要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);
}