-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathepisode6.js
156 lines (125 loc) · 3.55 KB
/
episode6.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Module
function foo() {
var something = 'cool';
var another = [1, 2, 3];
function doSomething() {
console.log(something);
}
function doAnother() {
console.log(another.join(' ! '));
}
}
// imporvement, make some cool module
function CoolModule() {
var something = 'cool';
var another = [1, 2, 3];
function doSomething() {
console.log(something);
}
function doAnother() {
console.log(another.join(' ! '));
}
return {
doSomething: doSomething,
doAnother: doAnother
};
}
var foo = CoolModule();// 返回一个对象字面量语法{key:value,...},返回一个函数API
//保持内部数据变量是隐藏且私有的状态
//可以将这个对象类型的返回值看作本质上是模块的公共 API。
foo.doSomething();// cool
foo.doAnother(); // 1 ! 2 !3
// 必须有外部的函数,该函数必须至少被调用1次(每次调用都会创建一个新的模块实例)。
// 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态
// improvement for simgle link module
var foo = (function CoolModule() {
var something = 'cool'
var another = [1, 2, 3];
function doSomething() {
console.log(something);
}
function doAnother() {
console.log(another.join(' ! '));
}
return {
doSomething: doSomething,
doAnother: doAnother
};
})();
foo.doSomething()
foo.doAnother();
// 我们将模块函数转换成了 IIFE,立即调用这个函数并将返回值直接赋值给单例的模块实例标识符 foo。
function CoolModule(id) {
function identify() {
console.log(id);
}
return {
identify: identify
};
}
var foo1 = CoolModule("foo 1");
var foo2 = CoolModule("foo 2");
foo1.identify() // "foo 1"
foo2.identify() // "foo 2"
var foo = (function CoolModule(id) {
function change() {
// 修改公共API
publicAPI.identify = identify2;
}
function identify1() {
console.log(id);
}
function identify2() {
console.log(id.toUpperCase())
}
var pubilicAPI = {
change: change,
identify: identify1
};
return pubilicAPI;
})('foo module');
foo.identify(); // foo module
foo.change();
foo.identify(); // FOO MODULE
// modern module mechanism
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
}
})
//为了模块的定义引入了包装函数(可以传入任何依赖),并且将返回值,也就是模块的 API,储存在一个根据名字来管理的模块列表中。
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
// 特点:调用包装了函数定义的包装函数,并且将返回值作为该模块的 API。