-
Notifications
You must be signed in to change notification settings - Fork 3
/
api.js
77 lines (64 loc) · 1.58 KB
/
api.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
/**
* API模式:回调模式、配置对象、返回函数、柯里化
*/
/*
* 回调模式
* @param callback {Function or String} 回调方法或字符串
* @param callback_obj {Object} 执行回调方法的对象
*/
var doSomething = function(callback, callback_obj) {
var param = "params";
if (typeof callback === "string") {
callback = callback_obj[callback];
}
if (typeof callback === "function") {
callback.call(callback_obj, param);
}
};
// demo code
var myapp = {};
myapp.paint = function(param) {
console.log("do myapp.paint: " + param);
};
doSomething("paint", myapp);
doSomething(function(param) {
console.log("do callback: " + param);
}, this);
/**
* 配置对象
*/
var addPerson = function(conf) {
//接收并处理conf
};
var conf = {
username: "batman",
first: "Bruce",
last: "Wayne"
};
addPerson(conf);
/*
* 柯里化
* 发现自己在调用同样的函数并且传入的参数大部分都相同的时候,就是考虑柯里化的理想场景了
* @param fn {Function}
*/
function schonfinkelize(fn) {
var slice = Array.prototype.slice,
stored_args = slice.call(arguments, 1);
return function() {
var new_args = slice.call(arguments),
args = stored_args.concat(new_args);
return fn.apply(null, args);
};
}
// demo
// 普通函数
function add(a, b, c, d, e) {
return a + b + c + d + e;
}
// 参数个数可以随意分割
var schonfinkelize(add, 1, 2, 3)(5, 5); // 16
// 两步柯里化
var addOne = schonfinkelize(add, 1);
addOne(10, 10, 10, 10); // 41
var addSix = schonfinkelize(addOne, 2, 3);
addSix(5, 5); // 16