我正在学习javascript函数作为对象,但我正在努力解决这个与闭包和模块有关的特定示例。
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" )); // Let me introduce: hippo
foo.awesome(); // LET ME INTRODUCE: HIPPO
现在,据我所知,MyModules是一个对象,属性为“define”,“get”为函数。 Module是一个对象,其属性在define函数的“name”参数中指定,该函数是一个字符串,deps是一个参数数组,impl是一个函数。我对吗?
我不明白的是modules[name] = impl.apply( impl, deps );
一部分。 apply方法有什么作用?我知道第二个参数,但调用方法的函数(object ??)的作用是什么,在apply方法中作为参数接受的函数的作用,函数的返回值以及它是如何实现的与上述相关? 文档说: 语法
fun.apply(thisArg,[argsArray]) 参数
thisArg 这个值为乐趣召唤提供了。请注意,这可能不是方法看到的实际值:如果方法是非严格模式代码中的函数,则null和undefined将替换为全局对象,并且原始值将被装箱。
argsArray 一个类数组的对象,指定应该调用fun的参数,如果不应该为函数提供参数,则为null或undefined。从ECMAScript 5开始,这些参数可以是类似通用数组的对象而不是数组。有关浏览器兼容性信息,请参阅下文。
返回值
使用指定的this和arguments调用函数的结果。
我编写了整个代码,因为我不知道我是否理解它,并且不想提供错误的信息。