您不需要的javascript模块模式';我不知道JS
我已经阅读和测试下面的代码好几个小时了,我似乎无法掌握某些东西。 我一直在浏览chrome控制台,基本上我可以添加的每一行都有中断,我一直在检查,我只是不确定 1) 我只是不确定deps阵列的用途。对我来说,第一件奇怪的事情是,为什么脚本不尝试将数据放在对它的第一次调用中(从您不需要的javascript模块模式';我不知道JS,javascript,module,callback,Javascript,Module,Callback,我已经阅读和测试下面的代码好几个小时了,我似乎无法掌握某些东西。 我一直在浏览chrome控制台,基本上我可以添加的每一行都有中断,我一直在检查,我只是不确定 1) 我只是不确定deps阵列的用途。对我来说,第一件奇怪的事情是,为什么脚本不尝试将数据放在对它的第一次调用中(从MyModules.define(“bar”,[],function())? 为什么脚本第二次调用define(MyModules.define(“foo”、[“bar”]、function(bar)),然后在第一次定义时将
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
绑定到函数对象本身,以便以可预测的方式包含(防止逃脱)任何错误的此作业。我没想到读者会挖掘这些细微差别。这是我的错误。我会在本书的未来版本中更加小心更新。:)