Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f8db561

Browse files
Create 12-JSInterview-Closures.md
1 parent 638e11f commit f8db561

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

‎Notes/12-JSInterview-Closures.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
## Only the important new concepts
2+
3+
- Closures are used in encapsulation and data hiding.
4+
5+
```
6+
(without closures)
7+
var count = 0;
8+
9+
function increment(){
10+
count++;
11+
}
12+
13+
in this code, anyone can access count and change it.
14+
15+
(with closures) -> put everything into a function
16+
17+
function counter() {
18+
var count = 0;
19+
20+
function increment(){
21+
count++;
22+
}
23+
}
24+
console.log(count); // this will give referenceError as count can't be accessed.
25+
26+
(inc with function using closure)
27+
28+
function counter() {
29+
var count = 0;
30+
return function increment(){
31+
count++;
32+
console.log(count);
33+
}
34+
}
35+
var counter1 = counter(); //counter fun has closure with count var.
36+
counter1(); // increments counter
37+
38+
Above code is not good and scalable for say, when you plan to implement decrement counter at a later stage.
39+
To address this issue, we use constructors
40+
41+
Adding decrement counter and refactoring code:
42+
43+
function Counter() { //constructor function. Good coding would be to capitalize first letter of ctor fun.
44+
var count = 0;
45+
this.incrementCounter = function(){ //anonymous function
46+
count++;
47+
console.log(count);
48+
}
49+
this.decrementCounter = function(){
50+
count--;
51+
console.log(count);
52+
}
53+
}
54+
55+
var counter1 = new Counter(); // new keyword for ctor fun
56+
counter1.incrementCounter();
57+
counter1.incrementCounter();
58+
counter1.decrementCounter();
59+
60+
// returns 1 2 1
61+
62+
```
63+
### Disadvantages of closure
64+
- Overconsumption of memory when using closure as everytime as those closed over variables are not garbage collected till program expires.
65+
So when creating many closures, more memory is accumulated and this can create memory leaks if not handled.
66+
- **Garbage collector : **Program in JS engine or browser that frees up unused memory. In highlevel languages like C++ or JAVA, garbage collection is left to the
67+
programmer, but in JS engine its done implicitly.
68+
69+
```
70+
function a() {
71+
var x = 0;
72+
return function b() {
73+
console.log(x);
74+
}
75+
}
76+
77+
var y = a(); // y is a copy of b()
78+
y();
79+
80+
Once a() is called, its element x should be garbage collected ideally. But fun b has closure over var x. So mem of x cannot be freed.
81+
Like this if more closures formed, it becomes an issue. To tacke this, JS engines like v8 and Chrome have smart garbage collection mechanisms.
82+
Say we have var x = 0, z = 10 inabove code. When console log happens, x is printed as 0 but z is removed automatically.
83+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /