1
00:00:01,215 --> 00:00:03,900
<v Jonas>In this lecture, I want to quickly talk about</v>

2
00:00:03,900 --> 00:00:08,620
how exactly it works to pass arguments into functions.

3
00:00:08,620 --> 00:00:11,410
And this goes back to the video that we had

4
00:00:11,410 --> 00:00:14,110
about primitives versus objects,

5
00:00:14,110 --> 00:00:15,980
which, remember, we also call

6
00:00:15,980 --> 00:00:19,000
primitive types and reference types.

7
00:00:19,000 --> 00:00:21,950
So this is kind of a review of that lecture,

8
00:00:21,950 --> 00:00:26,080
but applied to functions, because it's super important

9
00:00:26,080 --> 00:00:30,000
that we really understand how primitives and objects

10
00:00:30,000 --> 00:00:32,503
work in the context of functions.

11
00:00:34,240 --> 00:00:37,973
And so let's draw up a quick and simple example here.

12
00:00:39,100 --> 00:00:41,323
So let's set a flight number here,

13
00:00:44,300 --> 00:00:45,950
234,

14
00:00:45,950 --> 00:00:47,683
and an object,

15
00:00:49,970 --> 00:00:52,440
which is basically a passenger,

16
00:00:52,440 --> 00:00:54,640
which in this case is me.

17
00:00:54,640 --> 00:00:56,980
So name, Jonas

18
00:00:59,050 --> 00:01:00,610
Schmedtmann,

19
00:01:00,610 --> 00:01:03,203
and then some random passport number.

20
00:01:05,430 --> 00:01:08,480
So let's say just this, and by the way,

21
00:01:08,480 --> 00:01:12,650
I could have all of this code here as boilerplate already,

22
00:01:12,650 --> 00:01:15,690
so in the starter files, but I strongly believe

23
00:01:15,690 --> 00:01:18,430
that it's better to write the code here in a video,

24
00:01:18,430 --> 00:01:22,120
because then you are forced to write the code yourself,

25
00:01:22,120 --> 00:01:24,220
and second, it makes the examples

26
00:01:24,220 --> 00:01:26,590
a lot easier to understand.

27
00:01:26,590 --> 00:01:29,603
Anyway, I now want to create a check in function.

28
00:01:32,560 --> 00:01:37,060
So, basically when the passenger has already

29
00:01:37,060 --> 00:01:40,060
bought the flight and is then ready to check in

30
00:01:40,060 --> 00:01:41,223
to take the flight,

31
00:01:42,386 --> 00:01:44,886
and then let's say, there we need a flight number,

32
00:01:46,140 --> 00:01:49,110
and then also a passenger object,

33
00:01:49,110 --> 00:01:52,660
which contains data about the passenger itself.

34
00:01:52,660 --> 00:01:55,793
So basically we would call this function like this.

35
00:01:59,040 --> 00:02:02,150
So with the flight that we already have up here,

36
00:02:02,150 --> 00:02:05,263
and the Jonas object, in this case.

37
00:02:06,430 --> 00:02:10,570
Alright, so this is our flight, LH234.

38
00:02:10,570 --> 00:02:13,090
And this is our passenger,

39
00:02:13,090 --> 00:02:17,000
but now let's say that the number of the flight was changed.

40
00:02:17,000 --> 00:02:19,830
And so that can happen in the checkIn function.

41
00:02:19,830 --> 00:02:23,003
And so let's now change that flight number parameter here,

42
00:02:25,090 --> 00:02:27,600
and this is usually not a good practice to do,

43
00:02:27,600 --> 00:02:31,240
so you should not change the parameters of a function,

44
00:02:31,240 --> 00:02:33,870
but this is just to make a point.

45
00:02:33,870 --> 00:02:35,490
So let's say for some reason,

46
00:02:35,490 --> 00:02:38,923
the number now changed to LH999,

47
00:02:40,090 --> 00:02:43,180
and I will also change the name of the passenger,

48
00:02:43,180 --> 00:02:45,530
and that's because in aviation,

49
00:02:45,530 --> 00:02:49,100
usually they always add a Mr or a Mrs,

50
00:02:49,100 --> 00:02:51,253
in front of the name, okay.

51
00:02:52,360 --> 00:02:54,253
So let's do that, Mr,

52
00:02:55,200 --> 00:02:57,223
and then just the name of the passenger.

53
00:02:59,580 --> 00:03:02,940
So these are some changes that the check in function does.

54
00:03:02,940 --> 00:03:05,150
And then before we check in,

55
00:03:05,150 --> 00:03:08,193
it will just check if the passport number is correct.

56
00:03:09,100 --> 00:03:13,910
So let's say if passenger dot passport

57
00:03:15,660 --> 00:03:18,640
is equal to this one,

58
00:03:18,640 --> 00:03:20,780
and let's suppose that this function

59
00:03:20,780 --> 00:03:23,590
gets this data from some database,

60
00:03:23,590 --> 00:03:26,713
which contains the booked flights, right,

61
00:03:28,510 --> 00:03:31,780
then in this case, if the passport is correct,

62
00:03:31,780 --> 00:03:34,853
then let's alert, check in,

63
00:03:36,670 --> 00:03:37,563
and else,

64
00:03:40,560 --> 00:03:41,393
alert,

65
00:03:42,420 --> 00:03:44,993
wrong passport.

66
00:03:48,130 --> 00:03:50,090
Okay, and this part here will make

67
00:03:50,090 --> 00:03:52,590
a little bit more sense by the end of the lecture.

68
00:03:53,430 --> 00:03:54,930
Okay?

69
00:03:54,930 --> 00:03:57,720
And now what I want to do is to log both the flight

70
00:03:57,720 --> 00:04:00,220
and the Jonas object to the console

71
00:04:00,220 --> 00:04:02,763
after calling this checkIn function.

72
00:04:05,320 --> 00:04:07,633
So, flight,

73
00:04:11,200 --> 00:04:13,040
and Jonas.

74
00:04:13,040 --> 00:04:14,110
Okay.

75
00:04:14,110 --> 00:04:16,330
And now, as I save this, what do you think

76
00:04:16,330 --> 00:04:20,140
is gonna happen to these two variables here?

77
00:04:20,140 --> 00:04:22,250
Can you try to anticipate it,

78
00:04:22,250 --> 00:04:24,510
based on the code that we have here?

79
00:04:24,510 --> 00:04:29,330
So, anyway, let's see now, and here we get checked in,

80
00:04:29,330 --> 00:04:32,130
which for now isn't really important,

81
00:04:32,130 --> 00:04:35,840
but then what we get is the flight number,

82
00:04:35,840 --> 00:04:38,810
which is still LH234,

83
00:04:38,810 --> 00:04:41,260
so exactly as we defined it here,

84
00:04:41,260 --> 00:04:44,483
even though it seems like it was redefined here,

85
00:04:45,470 --> 00:04:47,540
so it really wasn't.

86
00:04:47,540 --> 00:04:50,750
And then we also get the Jonas object,

87
00:04:50,750 --> 00:04:55,750
but now the name is indeed changed to Mr Jonas Schmedtmann.

88
00:04:56,070 --> 00:04:58,110
And so that's this change here,

89
00:04:58,110 --> 00:05:01,393
that happened inside of the function, right?

90
00:05:02,340 --> 00:05:05,340
So maybe you actually saw this result coming,

91
00:05:05,340 --> 00:05:07,950
because we actually have seen this happening

92
00:05:07,950 --> 00:05:12,200
sometimes before, but let's, anyway, analyze it.

93
00:05:12,200 --> 00:05:16,280
So this flight here is a primitive type, right?

94
00:05:16,280 --> 00:05:18,010
It's just a string.

95
00:05:18,010 --> 00:05:21,900
And as we passed that value into the function down here,

96
00:05:21,900 --> 00:05:25,110
then the flight number here is basically a copy

97
00:05:25,110 --> 00:05:27,830
of that original value, right?

98
00:05:27,830 --> 00:05:30,230
So flight number contains a copy,

99
00:05:30,230 --> 00:05:34,970
and not simply the original value of the flight variable.

100
00:05:34,970 --> 00:05:37,900
So this would be exactly the same as writing

101
00:05:37,900 --> 00:05:40,570
flight number equals

102
00:05:41,840 --> 00:05:42,950
flight.

103
00:05:42,950 --> 00:05:45,240
And this would then also simply copy

104
00:05:45,240 --> 00:05:48,840
this value to flightNum, right?

105
00:05:48,840 --> 00:05:49,980
And so again,

106
00:05:49,980 --> 00:05:52,960
flightNum here is a completely different variable.

107
00:05:52,960 --> 00:05:55,170
And therefore, as we changed it here,

108
00:05:55,170 --> 00:05:58,993
it did not get reflected in the outside flight variable.

109
00:05:59,880 --> 00:06:03,560
Okay, and so it's still LH234,

110
00:06:03,560 --> 00:06:06,500
so exactly for the same reason as we saw before,

111
00:06:06,500 --> 00:06:11,090
in the primitives versus reference types lecture.

112
00:06:11,090 --> 00:06:14,150
But now what about the Jonas object that we passed,

113
00:06:14,150 --> 00:06:16,910
into the checkIn function and in that function,

114
00:06:16,910 --> 00:06:19,147
it is called passenger, right?

115
00:06:19,147 --> 00:06:22,230
And then we changed that passenger object here.

116
00:06:22,230 --> 00:06:24,420
And as we saw then,

117
00:06:24,420 --> 00:06:28,210
the Jonas object was also affected by that change.

118
00:06:28,210 --> 00:06:30,090
So why did that happen?

119
00:06:30,090 --> 00:06:32,820
And you might already know the answer.

120
00:06:32,820 --> 00:06:36,190
So when we pass a reference type to a function,

121
00:06:36,190 --> 00:06:39,240
what is copied is really just a reference

122
00:06:39,240 --> 00:06:42,030
to the object in the memory heap.

123
00:06:42,030 --> 00:06:44,853
So that would be exactly like doing this.

124
00:06:46,230 --> 00:06:48,160
So passenger

125
00:06:48,160 --> 00:06:48,993
equals

126
00:06:50,040 --> 00:06:50,873
Jonas.

127
00:06:51,970 --> 00:06:54,673
We can actually do this and here the same,

128
00:06:55,600 --> 00:07:00,083
just to get as a reference, same as doing,

129
00:07:01,030 --> 00:07:03,370
okay, and so, as you already know,

130
00:07:03,370 --> 00:07:06,510
when we try to copy an object like this,

131
00:07:06,510 --> 00:07:08,610
we are really only copying the reference

132
00:07:08,610 --> 00:07:11,310
to that object in the memory heap,

133
00:07:11,310 --> 00:07:14,440
but they both point to the same object in memory.

134
00:07:14,440 --> 00:07:17,220
And so that's exactly what is also happening here,

135
00:07:17,220 --> 00:07:19,660
with the Jonas object, as we pass it

136
00:07:19,660 --> 00:07:22,793
into the checkIn function where it's called passenger.

137
00:07:23,670 --> 00:07:27,460
So here, as we are manipulating the passenger object,

138
00:07:27,460 --> 00:07:31,890
it is exactly the same as manipulating the Jonas object.

139
00:07:31,890 --> 00:07:34,410
Once again, because they both are

140
00:07:34,410 --> 00:07:36,763
the same object in the memory heap.

141
00:07:38,680 --> 00:07:42,900
Alright, so in summary, passing a primitive type

142
00:07:42,900 --> 00:07:45,480
to a function is really just the same

143
00:07:45,480 --> 00:07:49,710
as creating a copy like this, outside of the function.

144
00:07:49,710 --> 00:07:51,920
So the value is simply copied.

145
00:07:51,920 --> 00:07:55,340
On the other hand, when we pass an object to a function,

146
00:07:55,340 --> 00:07:59,920
it is really just like copying an object like this.

147
00:07:59,920 --> 00:08:02,170
And so whatever we change in a copy

148
00:08:02,170 --> 00:08:04,760
will also happen in the original.

149
00:08:04,760 --> 00:08:06,970
Now, of course, we need to be careful

150
00:08:06,970 --> 00:08:10,520
with this behavior and always keep it in mind.

151
00:08:10,520 --> 00:08:12,780
That's because the fact that objects

152
00:08:12,780 --> 00:08:15,970
behave this way when passed to functions

153
00:08:15,970 --> 00:08:20,380
can have unforeseeable consequences in large code bases.

154
00:08:20,380 --> 00:08:22,910
And that's especially true when you're working

155
00:08:22,910 --> 00:08:25,160
with multiple developers.

156
00:08:25,160 --> 00:08:27,510
So let's write another quick function here

157
00:08:27,510 --> 00:08:29,710
to show you what can happen,

158
00:08:29,710 --> 00:08:34,370
so that you can be prepared for the real life, basically.

159
00:08:34,370 --> 00:08:38,520
So let's just create a function called

160
00:08:39,777 --> 00:08:40,777
newPassport.

161
00:08:44,270 --> 00:08:47,530
It will accept any person,

162
00:08:47,530 --> 00:08:49,970
and basically it will simply change

163
00:08:49,970 --> 00:08:52,413
that person's passport number.

164
00:08:54,980 --> 00:08:58,930
And so let's simply create a random number here,

165
00:08:58,930 --> 00:09:03,910
random, and let's multiply it by some huge number,

166
00:09:03,910 --> 00:09:05,150
and then this will create a number

167
00:09:05,150 --> 00:09:07,690
between one and

168
00:09:07,690 --> 00:09:10,070
this huge thing.

169
00:09:10,070 --> 00:09:11,720
So it doesn't really matter here.

170
00:09:12,770 --> 00:09:16,823
We will also know trunc, as we have used before,

171
00:09:18,380 --> 00:09:20,590
just so that we get a new big number,

172
00:09:20,590 --> 00:09:24,520
which will be the new passport now, right.

173
00:09:24,520 --> 00:09:27,393
And so now let's call that function actually,

174
00:09:28,360 --> 00:09:30,573
with the Jonas object,

175
00:09:31,520 --> 00:09:32,670
now, right.

176
00:09:32,670 --> 00:09:34,910
So let's say that I booked the flight

177
00:09:34,910 --> 00:09:37,670
with my original passport number here.

178
00:09:37,670 --> 00:09:39,280
And so that's the passport number

179
00:09:39,280 --> 00:09:43,800
that the checkIn function will then compare my passport to,

180
00:09:43,800 --> 00:09:45,883
that's why it's hard coded right here.

181
00:09:47,030 --> 00:09:51,973
But now, again, I change my passport before I check in.

182
00:09:54,870 --> 00:09:56,620
And so let's see what happens then.

183
00:09:58,230 --> 00:10:00,340
So here again, we need to pass in

184
00:10:00,340 --> 00:10:02,933
the flight and the passenger object.

185
00:10:04,150 --> 00:10:05,543
So, let's see.

186
00:10:07,200 --> 00:10:09,980
So it still says checked in here,

187
00:10:09,980 --> 00:10:14,920
but that's coming from this checkIn function call, okay.

188
00:10:14,920 --> 00:10:17,620
So then down here, the passport is changed,

189
00:10:17,620 --> 00:10:19,900
and then there's another checkIn call.

190
00:10:19,900 --> 00:10:22,290
So let's see the result of that.

191
00:10:22,290 --> 00:10:27,150
And so now, indeed, it says wrong passport, alright.

192
00:10:27,150 --> 00:10:29,470
And so what's happening now is that we have

193
00:10:29,470 --> 00:10:33,100
two functions manipulating the same object.

194
00:10:33,100 --> 00:10:35,573
And so that is creating a problem,

195
00:10:37,100 --> 00:10:38,240
right?

196
00:10:38,240 --> 00:10:40,300
So here the exact same thing is happening,

197
00:10:40,300 --> 00:10:42,010
in the new passport function.

198
00:10:42,010 --> 00:10:44,420
I'm passing in an object,

199
00:10:44,420 --> 00:10:47,010
and so that object here is then called person.

200
00:10:47,010 --> 00:10:50,810
And as the function manipulates that person object,

201
00:10:50,810 --> 00:10:54,310
of course, it also gets reflected in Jonas.

202
00:10:54,310 --> 00:10:57,170
And then as we pass that Jonas object

203
00:10:57,170 --> 00:11:00,140
into the checkIn function, then, of course,

204
00:11:00,140 --> 00:11:04,650
that passport is no longer the same as the original one.

205
00:11:04,650 --> 00:11:08,040
So, yeah, I think this is a nice example

206
00:11:08,040 --> 00:11:11,050
of seeing how the interaction of different functions

207
00:11:11,050 --> 00:11:14,690
with the same object can create some issues here.

208
00:11:14,690 --> 00:11:18,000
And of course, this is just a super simple example,

209
00:11:18,000 --> 00:11:21,020
but I'm sure you get the point, right?

210
00:11:21,020 --> 00:11:24,130
What matters is that you're aware of this issue,

211
00:11:24,130 --> 00:11:26,563
and then you can be careful with it.

212
00:11:27,890 --> 00:11:30,520
Let's just take out these lines of code.

213
00:11:30,520 --> 00:11:33,513
Also these, these don't really matter.

214
00:11:34,940 --> 00:11:37,860
Let's just make sure, and indeed, yeah,

215
00:11:37,860 --> 00:11:39,790
we get the wrong passport now,

216
00:11:39,790 --> 00:11:42,713
because of the new passport function down there.

217
00:11:44,720 --> 00:11:45,920
Okay.

218
00:11:45,920 --> 00:11:48,800
Now, just to finish, in programming,

219
00:11:48,800 --> 00:11:51,650
there are two terms that are used all the time

220
00:11:51,650 --> 00:11:53,260
when dealing with functions,

221
00:11:53,260 --> 00:11:57,570
which is passing by value, and passing by reference,

222
00:11:57,570 --> 00:12:01,110
and many experienced programmers that are new to JavaScript

223
00:12:01,110 --> 00:12:03,930
have some confusion between these terms

224
00:12:03,930 --> 00:12:05,870
and how it works in JavaScript.

225
00:12:05,870 --> 00:12:08,700
And so I wanna quickly address that here as well.

226
00:12:08,700 --> 00:12:12,560
So JavaScript does not have passing by reference,

227
00:12:12,560 --> 00:12:14,460
only passing by value,

228
00:12:14,460 --> 00:12:17,630
even though it looks like it's passing by reference.

229
00:12:17,630 --> 00:12:21,040
So there are languages like C++,

230
00:12:21,040 --> 00:12:24,690
where you can pass a reference to any value,

231
00:12:24,690 --> 00:12:27,030
instead of the value itself.

232
00:12:27,030 --> 00:12:28,860
This works even with primitives,

233
00:12:28,860 --> 00:12:32,170
so you could pass a reference to the value of five,

234
00:12:32,170 --> 00:12:33,470
and then the original value,

235
00:12:33,470 --> 00:12:36,490
outside of the function, would be changed.

236
00:12:36,490 --> 00:12:39,270
And this is called pass by reference.

237
00:12:39,270 --> 00:12:44,270
But once again, JavaScript does not have pass by reference.

238
00:12:44,440 --> 00:12:47,000
So if you already know some programming,

239
00:12:47,000 --> 00:12:50,940
but are new to JavaScript, be sure to understand this.

240
00:12:50,940 --> 00:12:54,180
And I know it's confusing, because as we just learned,

241
00:12:54,180 --> 00:12:58,840
for objects, we do in fact pass in a reference.

242
00:12:58,840 --> 00:13:01,950
So the memory address of the object.

243
00:13:01,950 --> 00:13:05,880
However, that reference itself is still a value.

244
00:13:05,880 --> 00:13:09,820
It's simply a value that contains a memory address.

245
00:13:09,820 --> 00:13:13,670
So basically we pass a reference to the function,

246
00:13:13,670 --> 00:13:16,530
but we do not pass by reference,

247
00:13:16,530 --> 00:13:19,690
and this is an important distinction.

248
00:13:19,690 --> 00:13:20,750
And once again,

249
00:13:20,750 --> 00:13:23,820
I'm only telling you this because there seems to be

250
00:13:23,820 --> 00:13:27,140
a lot of confusion going on about this topic

251
00:13:27,140 --> 00:13:30,300
among some JavaScript beginners, and especially

252
00:13:30,300 --> 00:13:34,303
when they come from other languages, such as C++.

