1
00:00:00,930 --> 00:00:04,100
<v Jonas>In this lecture, let's answer the question.</v>

2
00:00:04,100 --> 00:00:07,080
How is JavaScript code executed?

3
00:00:07,080 --> 00:00:09,890
We already know that it happens in a call stack

4
00:00:09,890 --> 00:00:13,373
in the engine, but let's dig a bit deeper now.

5
00:00:14,790 --> 00:00:15,750
And let's start

6
00:00:15,750 --> 00:00:20,020
by supposing that our code was just finished compiling.

7
00:00:20,020 --> 00:00:23,240
Just in the way that we learned in the last lecture.

8
00:00:23,240 --> 00:00:26,860
So the code is now ready to be executed.

9
00:00:26,860 --> 00:00:28,160
What happens then,

10
00:00:28,160 --> 00:00:32,890
is that a so-called global execution context is created

11
00:00:32,890 --> 00:00:35,280
for the top-level code.

12
00:00:35,280 --> 00:00:38,860
And top-level code is basically code that is not

13
00:00:38,860 --> 00:00:41,000
inside any function.

14
00:00:41,000 --> 00:00:43,330
So again, in the beginning

15
00:00:43,330 --> 00:00:48,330
only the code that is outside of functions will be executed.

16
00:00:48,410 --> 00:00:50,530
And this makes sense, right?

17
00:00:50,530 --> 00:00:54,370
Functions should only be executed when they are called.

18
00:00:54,370 --> 00:00:57,020
And actually we saw this happening already

19
00:00:57,020 --> 00:00:59,230
in our pig game project.

20
00:00:59,230 --> 00:01:01,490
So there we had an init function,

21
00:01:01,490 --> 00:01:04,400
which initialized our entire project

22
00:01:04,400 --> 00:01:07,210
but in order to actually initialize the game

23
00:01:07,210 --> 00:01:09,480
the first time that the page loaded,

24
00:01:09,480 --> 00:01:12,200
we needed to call that function immediately

25
00:01:12,200 --> 00:01:14,160
in our top-level code.

26
00:01:14,160 --> 00:01:16,500
And so that's what I mean here.

27
00:01:16,500 --> 00:01:18,490
But anyway, we can also see

28
00:01:18,490 --> 00:01:22,560
what top-level code is in this example here.

29
00:01:22,560 --> 00:01:24,860
So this name variable declaration

30
00:01:24,860 --> 00:01:27,950
is clearly top-level code right?

31
00:01:27,950 --> 00:01:30,330
And therefore it will be executed

32
00:01:30,330 --> 00:01:33,200
in the global execution context.

33
00:01:33,200 --> 00:01:36,860
Next, we have two functions, one expression,

34
00:01:36,860 --> 00:01:38,800
and one declaration.

35
00:01:38,800 --> 00:01:41,000
So these will also be declared,

36
00:01:41,000 --> 00:01:43,230
so that they can be called later.

37
00:01:43,230 --> 00:01:45,430
But the code inside the functions,

38
00:01:45,430 --> 00:01:49,890
will only be executed when the functions are called.

39
00:01:49,890 --> 00:01:53,880
Okay, so we know that a global execution context

40
00:01:53,880 --> 00:01:56,910
is created for top-level code.

41
00:01:56,910 --> 00:02:01,260
But now what exactly is an execution context?

42
00:02:01,260 --> 00:02:05,410
Well, an execution context is an abstract concept.

43
00:02:05,410 --> 00:02:08,400
But I define it basically as an environment

44
00:02:08,400 --> 00:02:12,510
in which a piece of JavaScript is executed.

45
00:02:12,510 --> 00:02:16,700
It's like a box that stores all the necessary information

46
00:02:16,700 --> 00:02:19,290
for some code to be executed.

47
00:02:19,290 --> 00:02:24,290
Such as local variables or arguments passed into a function.

48
00:02:24,590 --> 00:02:29,590
So, JavaScript code always runs inside an execution context.

49
00:02:29,930 --> 00:02:32,340
And to make this a bit more intuitive

50
00:02:32,340 --> 00:02:36,720
let's imagine you order a pizza at a takeaway.

51
00:02:36,720 --> 00:02:41,050
So usually that pizza comes in a box right?

52
00:02:41,050 --> 00:02:42,700
And it might also come

53
00:02:42,700 --> 00:02:45,440
with some other stuff that is necessary

54
00:02:45,440 --> 00:02:49,900
for you to eat a pizza such as cutlery or a receipt,

55
00:02:49,900 --> 00:02:54,150
so that you can actually pay for the pizza before eating it.

56
00:02:54,150 --> 00:02:55,730
So, in this analogy,

57
00:02:55,730 --> 00:02:59,640
the pizza is the JavaScript code to be executed,

58
00:02:59,640 --> 00:03:03,070
and the box is of course the execution context

59
00:03:03,070 --> 00:03:04,600
for our pizza.

60
00:03:04,600 --> 00:03:08,820
And that's because eating the pizza happens inside the box

61
00:03:08,820 --> 00:03:12,830
which is then the environment for eating pizza.

62
00:03:12,830 --> 00:03:16,440
The box also contains cutlery and the receipt,

63
00:03:16,440 --> 00:03:19,170
which are necessary to eat a pizza

64
00:03:19,170 --> 00:03:23,970
or in other words, to execute the code, okay?

65
00:03:23,970 --> 00:03:25,540
I hope that made sense,

66
00:03:25,540 --> 00:03:28,380
and to made the concept of execution context

67
00:03:28,380 --> 00:03:30,700
a little bit more clear.

68
00:03:30,700 --> 00:03:35,150
Now, in any JavaScript project, no matter how large it is,

69
00:03:35,150 --> 00:03:39,030
there is only ever one global execution context.

70
00:03:39,030 --> 00:03:41,830
It's always there as the default context,

71
00:03:41,830 --> 00:03:45,250
and it's where top-level code will execute.

72
00:03:45,250 --> 00:03:47,160
And speaking of execute,

73
00:03:47,160 --> 00:03:49,270
now that we have an environment

74
00:03:49,270 --> 00:03:52,300
where the top-level code can be executed,

75
00:03:52,300 --> 00:03:54,600
it finally is executed.

76
00:03:54,600 --> 00:03:59,420
And there is not a lot to say about the execution itself.

77
00:03:59,420 --> 00:04:02,500
It's just the computer CPU processing

78
00:04:02,500 --> 00:04:05,690
the machine code that it received.

79
00:04:05,690 --> 00:04:08,290
Okay, and once this first code,

80
00:04:08,290 --> 00:04:11,100
so the top-level of code is finished,

81
00:04:11,100 --> 00:04:14,950
functions finally start to execute as well.

82
00:04:14,950 --> 00:04:16,850
And here is how that works.

83
00:04:16,850 --> 00:04:18,813
For each and every function call,

84
00:04:18,813 --> 00:04:22,120
and you execution context will be created

85
00:04:22,120 --> 00:04:25,280
containing all the information that is necessary

86
00:04:25,280 --> 00:04:28,070
to run exactly that function.

87
00:04:28,070 --> 00:04:30,880
And the same goes for methods, of course,

88
00:04:30,880 --> 00:04:32,750
because they're simply functions

89
00:04:32,750 --> 00:04:36,180
attached to objects remember?

90
00:04:36,180 --> 00:04:39,590
Anyway, all these execution contexts together,

91
00:04:39,590 --> 00:04:42,630
make up the call stack that I mentioned before.

92
00:04:42,630 --> 00:04:44,943
But more on that in a second.

93
00:04:45,880 --> 00:04:49,030
Now, when all functions are done executing,

94
00:04:49,030 --> 00:04:51,300
the engine will basically keep waiting

95
00:04:51,300 --> 00:04:53,810
for callback functions to arrive

96
00:04:53,810 --> 00:04:56,150
so that it can execute these.

97
00:04:56,150 --> 00:04:59,130
For example, a callback function associated

98
00:04:59,130 --> 00:05:01,330
with a click event.

99
00:05:01,330 --> 00:05:04,700
And remember, that it's the event loop who provides

100
00:05:04,700 --> 00:05:06,660
these new callback functions

101
00:05:06,660 --> 00:05:08,723
as we learned in the last lecture.

102
00:05:09,630 --> 00:05:10,580
All right.

103
00:05:10,580 --> 00:05:14,150
So we know now what an execution context is,

104
00:05:14,150 --> 00:05:16,930
but don't really know what it's made of.

105
00:05:16,930 --> 00:05:18,970
So, what's inside of it?

106
00:05:18,970 --> 00:05:21,143
And so let's find that out next.

107
00:05:22,490 --> 00:05:26,420
And the first thing that's inside any execution context

108
00:05:26,420 --> 00:05:29,760
is a so-called variable environment.

109
00:05:29,760 --> 00:05:31,120
In this environment,

110
00:05:31,120 --> 00:05:34,920
all our variables and function declarations are stored,

111
00:05:34,920 --> 00:05:38,330
and there is also a special arguments object.

112
00:05:38,330 --> 00:05:39,940
This object contains,

113
00:05:39,940 --> 00:05:43,150
as the name says all the arguments that were passed

114
00:05:43,150 --> 00:05:46,500
into the function that the current execution context

115
00:05:46,500 --> 00:05:47,900
belongs to.

116
00:05:47,900 --> 00:05:50,530
Because remember each function

117
00:05:50,530 --> 00:05:53,110
gets its own execution context

118
00:05:53,110 --> 00:05:56,280
as soon as the function is called.

119
00:05:56,280 --> 00:05:58,380
So basically all the variables

120
00:05:58,380 --> 00:06:01,610
that are somehow declared inside a function,

121
00:06:01,610 --> 00:06:04,830
will end up in its variable environment.

122
00:06:04,830 --> 00:06:08,120
However, a function can also access variables

123
00:06:08,120 --> 00:06:10,210
outside of the function.

124
00:06:10,210 --> 00:06:12,920
And we have already seen that in action

125
00:06:12,920 --> 00:06:14,260
throughout this course,

126
00:06:14,260 --> 00:06:17,830
especially in the projects of the previous section.

127
00:06:17,830 --> 00:06:22,150
And this works because of something called the scope chain.

128
00:06:22,150 --> 00:06:24,040
And we will learn all about scoping

129
00:06:24,040 --> 00:06:26,680
and the scope chain later in the section.

130
00:06:26,680 --> 00:06:28,590
But for now, what you need to know

131
00:06:28,590 --> 00:06:31,850
is that the scope chain basically consists of

132
00:06:31,850 --> 00:06:34,810
references to variables that are located

133
00:06:34,810 --> 00:06:37,440
outside of the current function.

134
00:06:37,440 --> 00:06:39,880
And to keep track of the scope chain,

135
00:06:39,880 --> 00:06:43,260
it is stored in each execution context.

136
00:06:43,260 --> 00:06:47,290
Finally, each context also gets a special variable

137
00:06:47,290 --> 00:06:49,580
called the this keyword.

138
00:06:49,580 --> 00:06:52,110
And once more, there is a special lecture

139
00:06:52,110 --> 00:06:55,960
just about the this keyword later in the section.

140
00:06:55,960 --> 00:06:57,000
Okay.

141
00:06:57,000 --> 00:07:00,270
Now, the content of the execution context,

142
00:07:00,270 --> 00:07:03,490
so variable environment, scope chain

143
00:07:03,490 --> 00:07:08,490
and this keyword is generated in a so-called creation phase.

144
00:07:08,640 --> 00:07:11,453
Which happens right before execution.

145
00:07:12,350 --> 00:07:14,070
And now just one final

146
00:07:14,070 --> 00:07:17,610
but very important detail that we need to keep in mind,

147
00:07:17,610 --> 00:07:22,160
is that execution contexts belonging to arrow functions,

148
00:07:22,160 --> 00:07:25,040
do not get their own arguments keyword,

149
00:07:25,040 --> 00:07:29,420
nor do they get the this keyword, okay?

150
00:07:29,420 --> 00:07:31,530
So, basically arrow functions

151
00:07:31,530 --> 00:07:33,900
don't have the arguments object

152
00:07:33,900 --> 00:07:35,720
and the this keyword.

153
00:07:35,720 --> 00:07:38,570
Instead, they can use the arguments object,

154
00:07:38,570 --> 00:07:39,990
and the this keyword

155
00:07:39,990 --> 00:07:43,740
from their closest regular function parent.

156
00:07:43,740 --> 00:07:46,990
And this is an extremely important detail to remember

157
00:07:46,990 --> 00:07:51,310
about arrow functions and we will come back to it later.

158
00:07:51,310 --> 00:07:52,840
So these are the things

159
00:07:52,840 --> 00:07:56,080
that are necessary to run each function

160
00:07:56,080 --> 00:07:59,300
as well as the code in the top-level.

161
00:07:59,300 --> 00:08:03,250
Now behind the scenes, it's actually even more complex

162
00:08:03,250 --> 00:08:07,250
but I think we're fine like this, aren't we?

163
00:08:07,250 --> 00:08:11,240
And now let's actually try to simulate the creation phase

164
00:08:11,240 --> 00:08:13,810
for this code example here.

165
00:08:13,810 --> 00:08:16,610
So, as you hopefully know, by now,

166
00:08:16,610 --> 00:08:19,710
we will get one global execution context

167
00:08:19,710 --> 00:08:21,670
and one for each function.

168
00:08:21,670 --> 00:08:23,970
So one for the first function,

169
00:08:23,970 --> 00:08:26,970
and one for the second function.

170
00:08:26,970 --> 00:08:28,350
In the global context,

171
00:08:28,350 --> 00:08:31,560
we have the name variable declaration,

172
00:08:31,560 --> 00:08:34,200
the first and second function declarations,

173
00:08:34,200 --> 00:08:37,900
as well as the X variable declaration.

174
00:08:37,900 --> 00:08:40,580
For the functions, the variable environment

175
00:08:40,580 --> 00:08:43,180
will literally contain all the code

176
00:08:43,180 --> 00:08:45,520
of a particular function.

177
00:08:45,520 --> 00:08:49,530
Now the value of X is marked as unknown here,

178
00:08:49,530 --> 00:08:51,950
because this value is the result

179
00:08:51,950 --> 00:08:55,350
of the first function that we didn't run yet.

180
00:08:55,350 --> 00:08:58,810
But we will simulate this in the next slide.

181
00:08:58,810 --> 00:09:03,120
Now, technically none of these values actually become known

182
00:09:03,120 --> 00:09:07,670
during the creation phase, but only in the execution phase.

183
00:09:07,670 --> 00:09:10,660
So this is not 100% accurate here,

184
00:09:10,660 --> 00:09:12,850
but it's just to illustrate

185
00:09:12,850 --> 00:09:15,760
how these execution contexts work.

186
00:09:15,760 --> 00:09:18,750
Okay? So just keep that in mind.

187
00:09:18,750 --> 00:09:21,270
Anyway, now in the first function,

188
00:09:21,270 --> 00:09:25,430
we have the a variable set to 1 and the b variable

189
00:09:25,430 --> 00:09:28,350
which once again requires a function call

190
00:09:28,350 --> 00:09:30,620
in order to become known.

191
00:09:30,620 --> 00:09:34,550
Finally, the variable environment of the second function,

192
00:09:34,550 --> 00:09:37,470
contains the C variable set to 2,

193
00:09:37,470 --> 00:09:40,300
and since this is a irregular function,

194
00:09:40,300 --> 00:09:45,300
so not an arrow function, it also has the arguments object.

195
00:09:45,730 --> 00:09:48,010
And this object is an array,

196
00:09:48,010 --> 00:09:51,160
which contains all the arguments that were passed

197
00:09:51,160 --> 00:09:53,830
into the function when it was called.

198
00:09:53,830 --> 00:09:58,270
In this case, as you can see, that's 7 and 9.

199
00:09:58,270 --> 00:10:00,380
Quite simple right?

200
00:10:00,380 --> 00:10:04,180
Well, it's simple because this is an extremely small

201
00:10:04,180 --> 00:10:05,660
amount of code.

202
00:10:05,660 --> 00:10:09,500
But now imagine there are hundreds of execution contexts

203
00:10:09,500 --> 00:10:11,680
for hundreds of functions.

204
00:10:11,680 --> 00:10:13,800
How will the engine keep track

205
00:10:13,800 --> 00:10:17,020
of the order in which functions we're called?

206
00:10:17,020 --> 00:10:19,890
And how will it know where it currently is

207
00:10:19,890 --> 00:10:21,750
in the execution?

208
00:10:21,750 --> 00:10:25,403
Well, that's where the call stack finally comes in.

209
00:10:26,530 --> 00:10:28,500
And remember that the call stack,

210
00:10:28,500 --> 00:10:30,710
together with the memory heap,

211
00:10:30,710 --> 00:10:33,950
makes up the JavaScript engine itself.

212
00:10:33,950 --> 00:10:37,270
But what actually is the call stack?

213
00:10:37,270 --> 00:10:41,440
Well, it's basically a place where execution contexts

214
00:10:41,440 --> 00:10:44,450
get stacked on top of each other,

215
00:10:44,450 --> 00:10:45,770
in order to keep track

216
00:10:45,770 --> 00:10:49,564
of where we are in the programs execution.

217
00:10:49,564 --> 00:10:53,190
So the execution context that is on top of the stack,

218
00:10:53,190 --> 00:10:55,660
is the one that is currently running.

219
00:10:55,660 --> 00:10:57,400
And when it's finished running,

220
00:10:57,400 --> 00:10:59,620
it will be removed from the stack,

221
00:10:59,620 --> 00:11:01,400
and execution will go back

222
00:11:01,400 --> 00:11:04,270
to the previous execution context.

223
00:11:04,270 --> 00:11:06,780
And using the analogy from before,

224
00:11:06,780 --> 00:11:10,470
it is as if you bought pizzas with some friends.

225
00:11:10,470 --> 00:11:14,540
Each friend has a pizza box, and then you put the boxes

226
00:11:14,540 --> 00:11:17,490
on top of each other, forming a stack,

227
00:11:17,490 --> 00:11:21,093
in order to keep track, which pizza belongs to each friend.

228
00:11:21,980 --> 00:11:25,450
Now, all this sounds a bit abstract, doesn't it?

229
00:11:25,450 --> 00:11:28,480
And so to demonstrate how the call stack works,

230
00:11:28,480 --> 00:11:31,760
let's walk through this code example together,

231
00:11:31,760 --> 00:11:35,520
so that I can show you exactly what happens.

232
00:11:35,520 --> 00:11:38,200
So, once the code is compiled,

233
00:11:38,200 --> 00:11:41,510
top-level code will start execution.

234
00:11:41,510 --> 00:11:44,690
And then as we learned in the beginning of the lecture,

235
00:11:44,690 --> 00:11:47,940
a global execution context will be created

236
00:11:47,940 --> 00:11:50,850
for the top-level of code, right?

237
00:11:50,850 --> 00:11:54,260
So this is where all the code outside of any function

238
00:11:54,260 --> 00:11:56,270
will be executed.

239
00:11:56,270 --> 00:11:59,800
And what happens with this execution context?

240
00:11:59,800 --> 00:12:03,113
That's right, it will be put in the call stack.

241
00:12:04,120 --> 00:12:07,980
And since this context is now at the top of the stack,

242
00:12:07,980 --> 00:12:12,370
it is the one where the code is currently being executed.

243
00:12:12,370 --> 00:12:16,120
So, let's continue now with this execution.

244
00:12:16,120 --> 00:12:19,990
So here, there is a simple variable declaration.

245
00:12:19,990 --> 00:12:24,990
And then the first and the second functions are declared.

246
00:12:25,200 --> 00:12:29,950
So nothing fancy, but that's just how normal top-level code

247
00:12:29,950 --> 00:12:31,640
gets executed.

248
00:12:31,640 --> 00:12:33,930
But then, in the last line

249
00:12:33,930 --> 00:12:36,750
is where things start to get interesting.

250
00:12:36,750 --> 00:12:39,320
Here, we declare the X variable,

251
00:12:39,320 --> 00:12:41,840
with the value that is gonna be returned

252
00:12:41,840 --> 00:12:44,460
from calling the first function.

253
00:12:44,460 --> 00:12:47,383
And so let's actually call that function.

254
00:12:48,600 --> 00:12:52,430
Now what happens immediately when a function is called?

255
00:12:52,430 --> 00:12:55,920
Well, it gets its own execution context

256
00:12:55,920 --> 00:13:00,270
so that it can run the code that's inside its body.

257
00:13:00,270 --> 00:13:01,270
Perfect.

258
00:13:01,270 --> 00:13:03,690
And what happens to the context?

259
00:13:03,690 --> 00:13:07,200
Well, again it is put in the call stack,

260
00:13:07,200 --> 00:13:09,540
on top of the current context,

261
00:13:09,540 --> 00:13:13,640
and so it's now the new current execution context.

262
00:13:13,640 --> 00:13:14,473
Great.

263
00:13:14,473 --> 00:13:16,290
So, let's continue.

264
00:13:16,290 --> 00:13:20,010
So we have yet another simple variable declaration here,

265
00:13:20,010 --> 00:13:22,770
and this variable will of course be defined

266
00:13:22,770 --> 00:13:24,420
in the variable environment

267
00:13:24,420 --> 00:13:26,520
of the current execution context,

268
00:13:26,520 --> 00:13:29,950
and not in the global context, right?

269
00:13:29,950 --> 00:13:34,610
Then right in the next line, we have another function call.

270
00:13:34,610 --> 00:13:38,210
So, let's call that function and move there.

271
00:13:38,210 --> 00:13:41,030
And as you guessed a new execution context

272
00:13:41,030 --> 00:13:45,100
was created right away for this second function.

273
00:13:45,100 --> 00:13:46,990
And once more, it is pushed

274
00:13:46,990 --> 00:13:51,450
onto the call stack and becomes the new act of context.

275
00:13:51,450 --> 00:13:54,920
Now what's important to note here is that the execution

276
00:13:54,920 --> 00:13:59,420
of the first function has now been paused, okay?

277
00:13:59,420 --> 00:14:03,000
So again, we are running the second function now

278
00:14:03,000 --> 00:14:07,420
and in the meantime, no other function is being executed.

279
00:14:07,420 --> 00:14:10,170
The first function stopped at this point

280
00:14:10,170 --> 00:14:12,220
where the second function was called

281
00:14:12,220 --> 00:14:14,310
and will only continue as soon

282
00:14:14,310 --> 00:14:17,240
as this second function returns.

283
00:14:17,240 --> 00:14:21,080
And it has to work this way because remember,

284
00:14:21,080 --> 00:14:24,650
JavaScript has only one thread of execution.

285
00:14:24,650 --> 00:14:27,890
And so it can only do one thing at a time.

286
00:14:27,890 --> 00:14:30,463
Okay? Never forget that.

287
00:14:31,500 --> 00:14:36,500
Now, moving to the next line, we have a return statement

288
00:14:36,690 --> 00:14:40,670
meaning that the function will finish its execution.

289
00:14:40,670 --> 00:14:44,350
So, what does that mean for the call stack?

290
00:14:44,350 --> 00:14:45,970
Well, it basically means

291
00:14:45,970 --> 00:14:48,430
that the function's execution context,

292
00:14:48,430 --> 00:14:50,740
will be popped off the stack

293
00:14:50,740 --> 00:14:53,920
and disappear from the computer's memory.

294
00:14:53,920 --> 00:14:56,580
At least that's what you need to know for now

295
00:14:56,580 --> 00:15:00,060
because actually the popped off execution context

296
00:15:00,060 --> 00:15:02,250
might keep living in memory.

297
00:15:02,250 --> 00:15:05,300
But more about that later in the course.

298
00:15:05,300 --> 00:15:07,460
Anyway, what happens next,

299
00:15:07,460 --> 00:15:11,100
is that the previous execution context, will now be back

300
00:15:11,100 --> 00:15:14,740
to being the active execution context again.

301
00:15:14,740 --> 00:15:17,930
And so let's also go back to where we were

302
00:15:17,930 --> 00:15:20,340
before in the code.

303
00:15:20,340 --> 00:15:21,890
And I hope that by now,

304
00:15:21,890 --> 00:15:25,400
you start to see how the call stack really keeps track

305
00:15:25,400 --> 00:15:28,260
of the order of execution here.

306
00:15:28,260 --> 00:15:29,770
Without the call stack,

307
00:15:29,770 --> 00:15:32,180
how would the engine know which function

308
00:15:32,180 --> 00:15:34,410
was being executed before?

309
00:15:34,410 --> 00:15:38,180
It wouldn't know where to go back to, right?

310
00:15:38,180 --> 00:15:40,570
And that's the beauty of the call stack.

311
00:15:40,570 --> 00:15:44,030
It makes this process almost effortless.

312
00:15:44,030 --> 00:15:45,900
So I like to use the analogy

313
00:15:45,900 --> 00:15:49,070
of the call stack being like a map

314
00:15:49,070 --> 00:15:50,940
for the JavaScript engine.

315
00:15:50,940 --> 00:15:53,150
Because the call stack ensures

316
00:15:53,150 --> 00:15:56,760
that the order of execution never gets lost.

317
00:15:56,760 --> 00:16:01,200
Just like a map does, at least if you use it correctly.

318
00:16:01,200 --> 00:16:02,090
All right.

319
00:16:02,090 --> 00:16:05,080
So, we returned from the second function,

320
00:16:05,080 --> 00:16:06,990
or back in the first function

321
00:16:06,990 --> 00:16:09,580
where we have this calculation,

322
00:16:09,580 --> 00:16:13,730
and then finally this first function also returns.

323
00:16:13,730 --> 00:16:16,780
And so here the same as before happens.

324
00:16:16,780 --> 00:16:21,320
So the current execution context gets popped off the stack,

325
00:16:21,320 --> 00:16:25,030
and the previous context is now the current context

326
00:16:25,030 --> 00:16:27,440
where code is executed.

327
00:16:27,440 --> 00:16:31,540
In this case, we're back to the global execution context

328
00:16:31,540 --> 00:16:34,330
and the line of code where the first function

329
00:16:34,330 --> 00:16:36,100
was first called.

330
00:16:36,100 --> 00:16:40,290
So here, the return value is finally assigned to X

331
00:16:40,290 --> 00:16:42,713
and the execution is finished.

332
00:16:43,640 --> 00:16:47,230
Now the program will now actually stay in this state

333
00:16:47,230 --> 00:16:51,420
for forever until it is eventually really finished.

334
00:16:51,420 --> 00:16:55,040
And that only happens like when we close the browser tab,

335
00:16:55,040 --> 00:16:56,580
or the browser window.

336
00:16:56,580 --> 00:17:00,110
Only when the program is really finished like this,

337
00:17:00,110 --> 00:17:02,750
is when the global execution context

338
00:17:02,750 --> 00:17:05,750
is also popped off the stack.

339
00:17:05,750 --> 00:17:10,750
And this is in a nutshell how the call stack works.

340
00:17:10,770 --> 00:17:13,890
So hopefully it makes sense now that we say

341
00:17:13,890 --> 00:17:17,370
that Java script code runs inside the call stack.

342
00:17:17,370 --> 00:17:19,830
And actually it is more accurate to say

343
00:17:19,830 --> 00:17:23,480
that code runs inside of execution contexts

344
00:17:23,480 --> 00:17:25,020
that are in the stack.

345
00:17:25,020 --> 00:17:29,090
But the general point is that code runs in the call stack,

346
00:17:29,090 --> 00:17:30,853
which is of course true.

347
00:17:31,720 --> 00:17:32,670
Great.

348
00:17:32,670 --> 00:17:34,850
Next up, we will learn some more

349
00:17:34,850 --> 00:17:37,310
about the variable environment,

350
00:17:37,310 --> 00:17:39,890
and how variables are created.

351
00:17:39,890 --> 00:17:42,893
So stay tuned for the next video.

