-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclosure.js
80 lines (62 loc) · 1.83 KB
/
closure.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
// Closure
// Private variables
function outer() {
let someOuterVar = 0; // I'm destined to be private!
console.log('New scope created..');
return function() {
someOuterVar++;
console.log(someOuterVar);
}
}
// reference anon func, create closure
// new inc function closes over outer scope (someOuterVar)
const inc = outer();
console.log(inc.toString()); // inc is the returned anon func
inc(); // => 1
inc(); // => 2
// changes to var in one closure won't affect another
const inc2 = outer();
inc2(); // => 1 (not 3)
// Partial functions
// Ex 1
function ballType(type) {
return function(color) {
return color + ' ' + type;
}
}
const dodge = ballType('dodgeball'); // partially apply ballType
console.log(dodge('red')); // => red dodgeball
console.log(dodge('black')); // => black dodgeball
const base = ballType('baseball');
console.log(base('white')); // => white baseball
// Ex 2
function object(object) {
return function(color) {
return function(size) {
return size + ' ' + color + ' ' + object;
}
}
}
const color = object('cube');
let size = color('blue');
console.log(size('large')); // => large blue cube
size = color('orange');
console.log(size('small')); // => small orange cube
// Ex 3
// https://www.freecodecamp.org/news/how-to-use-partial-application-to-improve-your-javascript-code-5af9ad877833/
const list = (lastJoin, ...items) => {
const commaSeparated = items.slice(0,-1).join(", ");
const lastItem = items.pop();
return `${commaSeparated} ${lastJoin} ${lastItem}`;
}
const partial = (fn, firstArg) => {
return (...lastArgs) => {
return fn(firstArg, ...lastArgs);
}
}
const listAnd = partial(list, "and");
console.log(listAnd("red", "green", "blue"));
// => red, green, and blue
const listOr = partial(list, "or");
console.log(listOr("red", "green", "blue"));
// => red, green, or blue