Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
1
00:00:01,180 --> 00:00:03,630
Maybe it didn't seem like it
2
2
00:00:03,630 --> 00:00:08,380
but hoisting is actually a fairly straightforward process.
3
3
00:00:08,380 --> 00:00:11,500
So let's just go through the different scenarios here
4
4
00:00:11,500 --> 00:00:13,633
starting with variables.
5
5
00:00:15,410 --> 00:00:18,190
So let's just create three variables here
6
6
00:00:18,190 --> 00:00:21,583
using the three different ways of declaring them.
7
7
00:00:22,570 --> 00:00:26,090
So now let for the job, teacher
8
8
00:00:28,430 --> 00:00:32,980
and then const for the birth year
9
9
00:00:32,980 --> 00:00:36,970
let's just call it year 1991.
10
10
00:00:36,970 --> 00:00:39,170
And now let's try to use
11
11
00:00:39,170 --> 00:00:40,790
all of these three variables
12
12
00:00:40,790 --> 00:00:44,373
before declaring them, just to see what happens.
13
13
00:00:46,790 --> 00:00:51,790
So me, job and year.
14
14
00:00:56,990 --> 00:00:59,050
So from the rules that we learned
15
15
00:00:59,050 --> 00:01:00,440
in the previous lecture,
16
16
00:01:00,440 --> 00:01:02,643
what do you expect will happen now?
17
17
00:01:04,730 --> 00:01:09,070
Well, the first console dot log result in undefined,
18
18
00:01:09,070 --> 00:01:11,310
and that's because variables declared
19
19
00:01:11,310 --> 00:01:14,010
with var are actually hoisted,
20
20
00:01:14,010 --> 00:01:17,450
but they are hoisted to the value of undefined.
21
21
00:01:17,450 --> 00:01:20,310
And so therefore when we try to access them
22
22
00:01:20,310 --> 00:01:24,270
undefined is exactly the result that we get.
23
23
00:01:24,270 --> 00:01:27,150
And so that's the reason why we see this here.
24
24
00:01:27,150 --> 00:01:31,620
Then on the contrary we have this let variable,
25
25
00:01:31,620 --> 00:01:33,660
and so here we see that we cannot
26
26
00:01:33,660 --> 00:01:36,440
access job before initialization.
27
27
00:01:36,440 --> 00:01:38,740
And so that's exactly the kind of error
28
28
00:01:38,740 --> 00:01:41,100
that I showed you in the last slide.
29
29
00:01:41,100 --> 00:01:42,950
And the origin of this error
30
30
00:01:42,950 --> 00:01:46,600
is the fact that the job variable is still
31
31
00:01:46,600 --> 00:01:49,933
in the temporal dead zone here at this point.
32
32
00:01:51,200 --> 00:01:54,480
Right, so remember that the temporal dead zone
33
33
00:01:54,480 --> 00:01:58,360
of a variable declared with a let or const,
34
34
00:01:58,360 --> 00:02:01,450
starts from the beginning of the current scope
35
35
00:02:01,450 --> 00:02:04,010
and so that's basically here,
36
36
00:02:04,010 --> 00:02:06,540
so in this case, it's the global scope.
37
37
00:02:06,540 --> 00:02:08,670
So from the beginning of the scope
38
38
00:02:08,670 --> 00:02:12,070
until the point of the code where it is defined
39
39
00:02:12,070 --> 00:02:13,440
and so here.
40
40
00:02:13,440 --> 00:02:17,260
And this means that at this point of course,
41
41
00:02:17,260 --> 00:02:21,420
the job variable is still in the temporal dead zone,
42
42
00:02:21,420 --> 00:02:23,833
and the same is true for year.
43
43
00:02:25,140 --> 00:02:27,070
And so now we get the same error here
44
44
00:02:27,070 --> 00:02:29,890
for the year variable as well.
45
45
00:02:29,890 --> 00:02:34,460
All right, so let's comment out both of these.
46
46
00:02:34,460 --> 00:02:36,510
Let me just right here
47
47
00:02:36,510 --> 00:02:38,860
that is hoisting with variables
48
48
00:02:40,060 --> 00:02:42,493
and now let's try out functions.
49
49
00:02:45,860 --> 00:02:48,480
So let's create a function declarations
50
50
00:02:48,480 --> 00:02:50,313
and function expressions here.
51
51
00:02:51,560 --> 00:02:55,430
So function, and again I will use a simple add
52
52
00:02:55,430 --> 00:02:57,630
let me just call it, addDecl,
53
53
00:02:57,630 --> 00:03:00,680
which stands for declaration a, b
54
54
00:03:03,590 --> 00:03:06,363
and return a plus b,
55
55
00:03:07,850 --> 00:03:10,091
and now a function expression.
56
56
00:03:10,091 --> 00:03:14,853
So addExpression, at once more return a plus b.
57
57
00:03:22,790 --> 00:03:24,960
And now since we're doing these two,
58
58
00:03:24,960 --> 00:03:27,323
let's also create an arrow.
59
59
00:03:28,640 --> 00:03:33,640
So addArrow, a, b and return a plus b implicitly.
60
60
00:03:38,150 --> 00:03:39,830
So I hope you remember
61
61
00:03:39,830 --> 00:03:42,490
that this is how the arrow function works.
62
62
00:03:42,490 --> 00:03:43,640
And now once again
63
63
00:03:43,640 --> 00:03:45,500
let's try to use these functions,
64
64
00:03:45,500 --> 00:03:47,703
before they are defined.
65
65
00:03:49,070 --> 00:03:52,270
And so I will log them to the console,
66
66
00:03:52,270 --> 00:03:54,690
so the result of calling them
67
67
00:03:54,690 --> 00:03:56,393
because they returned something,
68
68
00:03:57,440 --> 00:04:00,480
and so we need to log the result to the console
69
69
00:04:00,480 --> 00:04:01,653
so as you already know.
70
70
00:04:03,620 --> 00:04:06,150
So let's add two plus three,
71
71
00:04:06,150 --> 00:04:08,520
and now what do you think will happen?
72
72
00:04:08,520 --> 00:04:11,210
Do you think that it will be undefined again
73
73
00:04:11,210 --> 00:04:15,520
just like we have here with the var variable?
74
74
00:04:15,520 --> 00:04:16,900
Let's see.
75
75
00:04:16,900 --> 00:04:20,590
And no, we actually get the result of five.
76
76
00:04:20,590 --> 00:04:22,330
And so indeed we were able
77
77
00:04:22,330 --> 00:04:24,750
to call the function declaration
78
78
00:04:24,750 --> 00:04:28,623
before it was actually defined here in the code.
79
79
00:04:30,130 --> 00:04:33,210
All right, and now let's try the same
80
80
00:04:33,210 --> 00:04:38,210
for the other two expression and addArrow,
81
81
00:04:41,250 --> 00:04:43,400
but now I hope that you can already
82
82
00:04:43,400 --> 00:04:45,940
anticipate what is gonna happen.
83
83
00:04:45,940 --> 00:04:47,860
And so indeed we get an
84
84
00:04:47,860 --> 00:04:52,200
cannot access addExpression before initialization.
85
85
00:04:52,200 --> 00:04:54,400
And so that's exactly the same error
86
86
00:04:54,400 --> 00:04:56,030
that we got before here
87
87
00:04:56,030 --> 00:04:59,160
with this let and const variables.
88
88
00:04:59,160 --> 00:05:01,770
And that's because this function here right now
89
89
00:05:01,770 --> 00:05:04,230
is simply a const variable too.
90
90
00:05:04,230 --> 00:05:06,530
And so it means that it's now also
91
91
00:05:06,530 --> 00:05:08,950
in the temporal dead zone right?
92
92
00:05:08,950 --> 00:05:11,460
So again we are simply assigning
93
93
00:05:11,460 --> 00:05:14,670
a function value to this variable.
94
94
00:05:14,670 --> 00:05:17,990
And since this variable was defined with const,
95
95
00:05:17,990 --> 00:05:20,130
it is now in a temporal dead zone
96
96
00:05:20,130 --> 00:05:21,960
and therefore we get this exact
97
97
00:05:21,960 --> 00:05:24,710
same error message as before.
98
98
00:05:24,710 --> 00:05:26,180
And the same of course
99
99
00:05:26,180 --> 00:05:30,210
is gonna happen with the arrow, right?
100
100
00:05:30,210 --> 00:05:31,860
But now let me show you what happens
101
101
00:05:31,860 --> 00:05:34,460
when we change these to var.
102
102
00:05:34,460 --> 00:05:37,573
So do you think that now it will work somehow?
103
103
00:05:38,560 --> 00:05:40,890
Okay, we still get an error,
104
104
00:05:40,890 --> 00:05:44,170
but it is another error message here.
105
105
00:05:44,170 --> 00:05:47,793
So right now addExpression is not a function.
106
106
00:05:48,800 --> 00:05:49,870
And once again
107
107
00:05:49,870 --> 00:05:54,110
the same is gonna be happening for the arrow.
108
108
00:05:54,110 --> 00:05:57,340
Okay, and now let's think about the reason
109
109
00:05:57,340 --> 00:06:00,150
for this different error message here.
110
110
00:06:00,150 --> 00:06:03,050
So as you already know, any variables declared
111
111
00:06:03,050 --> 00:06:07,350
with var will be hoisted and set to undefined.
112
112
00:06:07,350 --> 00:06:11,680
And now this addExpression here is essentially that,
113
113
00:06:11,680 --> 00:06:13,830
it's a variable declared with var
114
114
00:06:13,830 --> 00:06:16,120
and so right now it is undefined.
115
115
00:06:16,120 --> 00:06:18,141
And then here we are trying
116
116
00:06:18,141 --> 00:06:21,580
to call undefined basically.
117
117
00:06:21,580 --> 00:06:26,580
So we are doing essentially this so undefined
118
118
00:06:27,650 --> 00:06:29,610
and then we are trying to call it.
119
119
00:06:29,610 --> 00:06:33,313
And so we should not get the exact same error.
120
120
00:06:34,180 --> 00:06:36,563
So you see it's not a function.
121
121
00:06:37,410 --> 00:06:39,100
And in fact, let me show it
122
122
00:06:39,100 --> 00:06:40,493
to you here even better.
123
123
00:06:41,470 --> 00:06:44,783
So addArrow should now be undefined,
124
124
00:06:46,883 --> 00:06:49,363
and indeed, here it is.
125
125
00:06:50,310 --> 00:06:52,100
And once more that is because
126
126
00:06:52,100 --> 00:06:56,010
we now declared these two here with var.
127
127
00:06:56,010 --> 00:07:00,504
Okay, so let's simply take both of these out
128
128
00:07:00,504 --> 00:07:03,110
and for you to keep this as a reference,
129
129
00:07:03,110 --> 00:07:04,920
I will leave this one as a var
130
130
00:07:04,920 --> 00:07:07,780
and this as a const,
131
131
00:07:07,780 --> 00:07:11,890
but just know that both of them will not work.
132
132
00:07:11,890 --> 00:07:13,680
The only function that you can use
133
133
00:07:13,680 --> 00:07:18,490
before declaring it, is the add function declaration.
134
134
00:07:18,490 --> 00:07:21,640
Okay. So now we covered all the rules here
135
135
00:07:21,640 --> 00:07:23,740
and saw how hoisting works.
136
136
00:07:23,740 --> 00:07:26,480
But now let's show me a very cool example
137
137
00:07:26,480 --> 00:07:30,900
which can demonstrate a pitfall of hoisting.
138
138
00:07:30,900 --> 00:07:34,370
And so it's a mistake that we can easily make
139
139
00:07:34,370 --> 00:07:35,950
if we're not careful
140
140
00:07:35,950 --> 00:07:38,080
and at the same time use var,
141
141
00:07:38,080 --> 00:07:40,320
to declare our variables.
142
142
00:07:40,320 --> 00:07:43,453
So let's just write example here.
143
143
00:07:46,030 --> 00:07:49,983
So to start, let's declare a fictional function here,
144
144
00:07:51,890 --> 00:07:55,400
so a function which is a function declaration,
145
145
00:07:55,400 --> 00:07:56,670
and that's important.
146
146
00:07:56,670 --> 00:07:59,000
So a fictional function that will delete
147
147
00:08:00,200 --> 00:08:01,720
the shopping cart.
148
148
00:08:01,720 --> 00:08:02,860
So let's say that we have
149
149
00:08:02,860 --> 00:08:06,003
like an eCommerce website or application.
150
150
00:08:07,330 --> 00:08:12,330
So let's simply log here, all products deleted.
151
151
00:08:14,090 --> 00:08:16,580
And so this is a dangerous function
152
152
00:08:16,580 --> 00:08:20,650
okay, that we should not be calling without care.
153
153
00:08:20,650 --> 00:08:23,960
Next, let's also declare a variable
154
154
00:08:23,960 --> 00:08:26,470
which contains the number of products.
155
155
00:08:26,470 --> 00:08:28,780
And so now I will use a var
156
156
00:08:28,780 --> 00:08:30,750
and this will then show you once more
157
157
00:08:30,750 --> 00:08:35,477
why we should not use var products equals 10.
158
158
00:08:38,600 --> 00:08:40,820
And now here at the top of our code,
159
159
00:08:40,820 --> 00:08:42,950
we are going to write some logic
160
160
00:08:42,950 --> 00:08:45,010
which will delete the shopping cart,
161
161
00:08:45,010 --> 00:08:48,310
whenever the number of products is zero.
162
162
00:08:48,310 --> 00:08:51,650
Now we already know that zero is a false value
163
163
00:08:51,650 --> 00:08:55,663
and so we can write this, right?
164
164
00:08:57,490 --> 00:09:00,703
So in this case, we want to call,
165
165
00:09:00,703 --> 00:09:03,890
deleteShoppingCart now right?
166
166
00:09:03,890 --> 00:09:08,890
So again, here we have var numProducts set to 10,
167
167
00:09:09,000 --> 00:09:10,810
but then here we have this logic
168
168
00:09:10,810 --> 00:09:12,860
in which we want to write that
169
169
00:09:12,860 --> 00:09:14,340
when there is no products,
170
170
00:09:14,340 --> 00:09:17,360
we want to delete the shopping cart.
171
171
00:09:17,360 --> 00:09:19,993
But now what would actually happens?
172
172
00:09:21,890 --> 00:09:24,760
So we get all products deleted
173
173
00:09:24,760 --> 00:09:28,780
even though numProducts is actually 10.
174
174
00:09:28,780 --> 00:09:30,780
So why did that happen?
175
175
00:09:30,780 --> 00:09:33,690
Well, it is because of hoisting.
176
176
00:09:33,690 --> 00:09:36,570
So at this point of the code here,
177
177
00:09:36,570 --> 00:09:39,210
the numProducts variable is in fact,
178
178
00:09:39,210 --> 00:09:42,960
not 10 instead, what is it?
179
179
00:09:42,960 --> 00:09:45,550
Well, it is undefined.
180
180
00:09:45,550 --> 00:09:47,870
And that's because of the way hoisting works
181
181
00:09:47,870 --> 00:09:50,120
with var variables.
182
182
00:09:50,120 --> 00:09:53,830
So we just show that to you very quickly,
183
183
00:09:53,830 --> 00:09:57,790
and so indeed, now here from line 71,
184
184
00:09:57,790 --> 00:10:00,380
which is this one, we get this undefined.
185
185
00:10:00,380 --> 00:10:03,620
And we know that undefined is also a false value,
186
186
00:10:03,620 --> 00:10:08,620
and so therefore, this code will instill execute
187
187
00:10:08,790 --> 00:10:12,780
even though we thought that numProducts is 10,
188
188
00:10:12,780 --> 00:10:14,690
but in fact, it's undefined,
189
189
00:10:14,690 --> 00:10:17,590
and so that will also trigger the execution
190
190
00:10:17,590 --> 00:10:19,830
of this if block here.
191
191
00:10:19,830 --> 00:10:20,770
Now of course,
192
192
00:10:20,770 --> 00:10:24,010
this is just a fictional tiny example
193
193
00:10:24,010 --> 00:10:25,610
but in a large code base
194
194
00:10:25,610 --> 00:10:28,120
with thousands of lines of code
195
195
00:10:28,120 --> 00:10:29,936
and without best practices,
196
196
00:10:29,936 --> 00:10:33,010
something like this can totally happen
197
197
00:10:33,010 --> 00:10:34,460
and it's gonna be a bug,
198
198
00:10:34,460 --> 00:10:36,600
that will be hard to find.
199
199
00:10:36,600 --> 00:10:39,860
So what are these best practices?
200
200
00:10:39,860 --> 00:10:42,360
What is the conclusion of all this?
201
201
00:10:42,360 --> 00:10:45,667
Well, as a first step, as I told you many times
202
202
00:10:45,667 --> 00:10:49,690
just don't use var to declare variables.
203
203
00:10:49,690 --> 00:10:53,350
Use const most of the time to declare variables
204
204
00:10:53,350 --> 00:10:55,560
and let, if you really need to change
205
205
00:10:55,560 --> 00:10:57,010
the variable later.
206
206
00:10:57,010 --> 00:11:00,090
Also in order to write clean code,
207
207
00:11:00,090 --> 00:11:02,230
you should declare your variables
208
208
00:11:02,230 --> 00:11:04,360
at the top of each scope.
209
209
00:11:04,360 --> 00:11:06,110
That will just make your code
210
210
00:11:06,110 --> 00:11:08,620
at least look a little bit better.
211
211
00:11:08,620 --> 00:11:11,911
Finally, always declare all your functions first
212
212
00:11:11,911 --> 00:11:15,140
and use them only after the declaration.
213
213
00:11:15,140 --> 00:11:17,630
And this applies to all types of functions,
214
214
00:11:17,630 --> 00:11:20,780
even function declarations, which are hoisted.
215
215
00:11:20,780 --> 00:11:22,860
So you could use function declarations
216
216
00:11:22,860 --> 00:11:25,040
before you declare them,
217
217
00:11:25,040 --> 00:11:28,610
but still just don't do that it's just not clean.
218
218
00:11:28,610 --> 00:11:30,510
Okay, so what I just told you
219
219
00:11:30,510 --> 00:11:32,120
are the best practices,
220
220
00:11:32,120 --> 00:11:35,710
not the rules of how it works in JavaScript.
221
221
00:11:35,710 --> 00:11:38,080
All right, and now just to finish,
222
222
00:11:38,080 --> 00:11:40,240
since we're talking about the differences
223
223
00:11:40,240 --> 00:11:42,970
between let, const and var here,
224
224
00:11:42,970 --> 00:11:44,560
let's just take two minutes
225
225
00:11:44,560 --> 00:11:47,623
to see yet another small difference between them.
226
226
00:11:50,015 --> 00:11:53,710
So let's again declare one variable for each
227
227
00:11:54,650 --> 00:11:56,993
let y equals two.
228
228
00:11:59,060 --> 00:12:01,513
So the values don't matter at all here.
229
229
00:12:02,380 --> 00:12:04,060
And now let's just take a look
230
230
00:12:04,060 --> 00:12:06,543
at the window object in the console.
231
231
00:12:09,210 --> 00:12:13,693
Okay, x has been out of course, z here,
232
232
00:12:15,230 --> 00:12:18,040
and so let's now take a look here
233
233
00:12:18,040 --> 00:12:22,040
at the window object here in the console.
234
234
00:12:22,040 --> 00:12:24,570
And window is the global object
235
235
00:12:24,570 --> 00:12:27,000
of JavaScript in the browser.
236
236
00:12:27,000 --> 00:12:30,423
And you can see all kinds of stuff in here,
237
237
00:12:31,680 --> 00:12:33,570
for example, the alert window
238
238
00:12:33,570 --> 00:12:34,970
that we have used before
239
239
00:12:36,800 --> 00:12:39,750
or also some other functions
240
240
00:12:39,750 --> 00:12:43,000
that we probably might have used already before.
241
241
00:12:43,000 --> 00:12:45,183
So I'm not gonna go into that here,
242
242
00:12:46,730 --> 00:12:48,113
but what is important,
243
243
00:12:48,960 --> 00:12:51,550
so let's go all the way to the down here
244
244
00:12:51,550 --> 00:12:53,990
and you can of course explore this by yourself
245
245
00:12:53,990 --> 00:12:56,020
in case you're interested in,
246
246
00:12:56,020 --> 00:12:57,570
but what matters here
247
247
00:12:57,570 --> 00:12:59,730
is that besides all these functions,
248
248
00:12:59,730 --> 00:13:03,860
we also get a property of x equals one.
249
249
00:13:03,860 --> 00:13:05,580
And that's exactly the variable
250
250
00:13:05,580 --> 00:13:10,193
that we declared right here using the var keyword.
251
251
00:13:10,193 --> 00:13:14,480
However, we cannot find y or z here
252
252
00:13:14,480 --> 00:13:16,500
anywhere in this object.
253
253
00:13:16,500 --> 00:13:18,260
And that's because they were declared
254
254
00:13:18,260 --> 00:13:20,740
with let or const.
255
255
00:13:20,740 --> 00:13:23,150
And so variables declared that way
256
256
00:13:23,150 --> 00:13:26,053
do not create properties on the window object.
257
257
00:13:26,920 --> 00:13:30,840
So let me actually demonstrate this to you even better.
258
258
00:13:30,840 --> 00:13:34,280
So we can say or we can test,
259
259
00:13:34,280 --> 00:13:39,280
x equal, equal, equal window dot x.
260
260
00:13:40,510 --> 00:13:42,550
So here we are testing if x
261
261
00:13:42,550 --> 00:13:47,550
is actually a property of the window object.
262
262
00:13:47,610 --> 00:13:49,300
And so if it is, then of course
263
263
00:13:49,300 --> 00:13:52,603
x must be the same as window dot x.
264
264
00:13:53,730 --> 00:13:56,210
And actually it is true.
265
265
00:13:56,210 --> 00:14:00,203
And now the same for y and z,
266
266
00:14:08,060 --> 00:14:11,550
and so in these cases, it is both false.
267
267
00:14:11,550 --> 00:14:15,120
So in conclusion I just wanted to let you know
268
268
00:14:15,120 --> 00:14:17,540
that variables declared with var,
269
269
00:14:17,540 --> 00:14:19,070
will create a property
270
270
00:14:19,070 --> 00:14:21,050
on the global window object.
271
271
00:14:21,050 --> 00:14:24,950
And that can have some implications in some cases.
272
272
00:14:24,950 --> 00:14:27,050
And again, you can take some time
273
273
00:14:27,050 --> 00:14:28,850
to explore the window object
274
274
00:14:28,850 --> 00:14:30,490
because it's quite interesting to see
275
275
00:14:30,490 --> 00:14:32,373
everything that is in there.
276
276
00:14:33,210 --> 00:14:35,210
All right, but with that being said
277
277
00:14:35,210 --> 00:14:38,180
let's now finally move on to our next topic
278
278
00:14:38,180 --> 00:14:40,253
which is gonna be the disc keyword.
23195
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.