<script>
var Modules = (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
    }
})();
Modules.define("bar",[],function(){
    function hello(who)
    {
        return "welcome"+who;
    }
    return {
        hello:hello
    }
})
Modules.define("foo",["bar"],function(bar){
    var nameWho = "Kitty";
    function awesome()
    {
        console.log(bar.hello(nameWho).toUpperCase());
    }
    return {
        awesome:awesome
    }
})
var bar = Modules.get("bar");
var foo =Modules.get("foo");
console.log(
    bar.hello("Kitty")
    );
foo.awesome();
</script>

apply:劫持另外一个对象的方法,继承另外一个对象的属性。
Function.apply(obj,args)能接受两个参数
obj:这个对象代替Function类里的this对象
args:这是个数组,它将作为参数传递给Function(args-arguments)

<script>
    function hello()
    {

        {
            console.log("hello");
        }

    }
    function hi()
    {
        hello.apply(this,arguments);
        console.log("hi");
    }
    var Hi = new hi();
    //hi.apply("hello",[]);
</script>