Troubleshooting a Context Problem

7 minutes
Share the link to this page
Copied
  Completed
You need to have access to the item to view this lesson.
One-time Fee
$99.99
List Price:  $139.99
You save:  $40
€93.84
List Price:  €131.38
You save:  €37.54
£80.95
List Price:  £113.34
You save:  £32.38
CA$137.04
List Price:  CA$191.86
You save:  CA$54.82
A$154.99
List Price:  A$216.99
You save:  A$62
S$136.27
List Price:  S$190.79
You save:  S$54.51
HK$783.50
List Price:  HK$1,096.94
You save:  HK$313.43
CHF 91.19
List Price:  CHF 127.67
You save:  CHF 36.48
NOK kr1,101.37
List Price:  NOK kr1,541.96
You save:  NOK kr440.59
DKK kr700.13
List Price:  DKK kr980.21
You save:  DKK kr280.08
NZ$169.21
List Price:  NZ$236.90
You save:  NZ$67.69
د.إ367.23
List Price:  د.إ514.14
You save:  د.إ146.90
৳10,965.37
List Price:  ৳15,351.96
You save:  ৳4,386.58
₹8,334.23
List Price:  ₹11,668.26
You save:  ₹3,334.02
RM477.95
List Price:  RM669.15
You save:  RM191.20
₦125,683.43
List Price:  ₦175,961.83
You save:  ₦50,278.40
₨27,806
List Price:  ₨38,929.52
You save:  ₨11,123.51
฿3,703.32
List Price:  ฿5,184.80
You save:  ฿1,481.48
₺3,259.92
List Price:  ₺4,564.01
You save:  ₺1,304.09
B$516.59
List Price:  B$723.25
You save:  B$206.66
R1,923.67
List Price:  R2,693.22
You save:  R769.54
Лв183.31
List Price:  Лв256.64
You save:  Лв73.33
₩137,775.97
List Price:  ₩192,891.88
You save:  ₩55,115.90
₪378.18
List Price:  ₪529.46
You save:  ₪151.28
₱5,754.62
List Price:  ₱8,056.70
You save:  ₱2,302.07
¥15,478.45
List Price:  ¥21,670.45
You save:  ¥6,192
MX$1,711.89
List Price:  MX$2,396.72
You save:  MX$684.82
QR364.36
List Price:  QR510.13
You save:  QR145.76
P1,383.88
List Price:  P1,937.49
You save:  P553.61
KSh13,448.65
List Price:  KSh18,828.65
You save:  KSh5,380
E£4,807.48
List Price:  E£6,730.67
You save:  E£1,923.18
ብር5,687.89
List Price:  ብር7,963.28
You save:  ብር2,275.38
Kz83,485.81
List Price:  Kz116,883.48
You save:  Kz33,397.66
CLP$95,253.47
List Price:  CLP$133,358.67
You save:  CLP$38,105.20
CN¥724.60
List Price:  CN¥1,014.47
You save:  CN¥289.87
RD$5,894.01
List Price:  RD$8,251.85
You save:  RD$2,357.84
DA13,445.45
List Price:  DA18,824.17
You save:  DA5,378.72
FJ$227.71
List Price:  FJ$318.80
You save:  FJ$91.09
Q777.29
List Price:  Q1,088.24
You save:  Q310.94
GY$20,903.54
List Price:  GY$29,265.80
You save:  GY$8,362.25
ISK kr14,104.58
List Price:  ISK kr19,746.98
You save:  ISK kr5,642.40
DH1,013.18
List Price:  DH1,418.50
You save:  DH405.31
L1,782.83
List Price:  L2,496.04
You save:  L713.20
ден5,776.11
List Price:  ден8,086.79
You save:  ден2,310.67
MOP$806.39
List Price:  MOP$1,128.98
You save:  MOP$322.58
N$1,907.39
List Price:  N$2,670.43
You save:  N$763.03
C$3,677.32
List Price:  C$5,148.40
You save:  C$1,471.07
रु13,326.11
List Price:  रु18,657.10
You save:  रु5,330.98
S/368.16
List Price:  S/515.44
You save:  S/147.28
K379.71
List Price:  K531.61
You save:  K151.90
SAR375.04
List Price:  SAR525.07
You save:  SAR150.03
ZK2,580.25
List Price:  ZK3,612.45
You save:  ZK1,032.20
L466.96
List Price:  L653.76
You save:  L186.80
Kč2,370.96
List Price:  Kč3,319.44
You save:  Kč948.48
Ft36,978.60
List Price:  Ft51,771.52
You save:  Ft14,792.91
SEK kr1,088.71
List Price:  SEK kr1,524.24
You save:  SEK kr435.53
ARS$87,217.91
List Price:  ARS$122,108.57
You save:  ARS$34,890.65
Bs692.87
List Price:  Bs970.05
You save:  Bs277.17
COP$390,680.46
List Price:  COP$546,968.27
You save:  COP$156,287.81
₡50,009.58
List Price:  ₡70,015.41
You save:  ₡20,005.83
L2,466.51
List Price:  L3,453.22
You save:  L986.70
₲740,348.57
List Price:  ₲1,036,517.61
You save:  ₲296,169.04
$U3,852.35
List Price:  $U5,393.45
You save:  $U1,541.09
zł405.43
List Price:  zł567.62
You save:  zł162.18
Already have an account? Log In

Transcript

Open the file troubleshooting example three. So here I've created an object called app. And this app object has two properties. The first one is a method called show delete selected. And that just shows the delete selected. button.

And the second method is called salespeople Li iterator. And that's used as an iterator for each salesperson, Li. So down here, we're calling the each method on salespeople Li. So this happens 10 times and each time it happens we're passing it app that salespeople iterator. So this is going to be executed 10 times and when it's executed. Each on each execution we're setting up a click event handler for that list items, select button.

So let's run example number three and see how we make out so troubleshooting. Example number three, okay, so ran the code, and then I'm going to select one of the buttons I get an error. Okay, so let's take a look at this error, type error this show delete selected is not a function. Well, what's the first question we want to ask ourselves when we troubleshoot? We want to ask ourselves, is it a scope problem? Or is it a context problem?

And I gotta say that whenever I see the JavaScript, this keyword in an error, I pretty much feel like it's a dead giveaway. It's, it's, it's very unlikely. It's not a context problem, because I see the word this. So you know, it could be scoped, but I'm gonna go with context on this one, because I see that this keyword. So um, as far as where to begin, I think I'll just copy this code. And then when I go to our code, I'll do a search for that exact piece of code and see where it takes us.

And it takes us to line 22. So I think that's where our problem it's at least starting there. So why don't I comment out that line of code prevent the problem from happening and Then what I'll do is I'll think, well, if the problem is this dot show, delete selected, we've got to know more about this. What is this on line 22? Well, I'm going to put it into a console dirt here. And we can inspect this just to sort of figure out is this really what we think it is?

And remember, when we see the keyword this we think context. So is the context what we think it is on line 22. So save that, and let's go back and refresh the page. And then I'll click this Select button, and I see something here in the console, I see button dot select. So this looks to me like a DOM element. I mean, I see properties like child nodes and children and class list and this style property.

So this is a DOM element. In fact, it's the element that was just clicked. So that means that I'm thinking on line 22, that this, the context is this app object and I can just call them This show delete selected, but it turns out that this on line 22 actually resolves to the button that was just clicked this button right here. And that makes perfect sense because this is the click event handler. And the click event handler is executed in the context of the moment that was clicked. So it turns out that this is not what we assumed it was the context is different than we thought it was.

And we found that out by doing console dirt, so we need to fix that. So let's take a look at troubleshooting example number four. First, let's run it and see how it works. So if you go down to troubleshooting example number four, run that code and we click Select. And in each case, when we click the Select button, the select button disappears, the Select shows and the element at the selected classes toggle so everything works as we expected. Let's figure out why.

Well what happened on line number on in troubleshooting example for is on line 22. Instead of saying this dot show, delete selected, we said actually Should not show delete selected. And the reason that works is because app is a global variable. And because of lexical scoping this function, this callback function has access to the variables defined outside of it, it can see outside of itself. So we just reference app instead of this. And we say app dot show, delete selected, and it works fine.

Now part of the way that we fix this is if you remember an example number three, we just pass a reference to App dot salespeople iterator to each iteration of salespeople Li but here example before one of the things we also did is that we we pass a callback function here. And then we execute at that salespeople iterator and that's also a way that we help solve the problem because now apt salespeople iterator is not being executed in the context of the button. It's just being executed. So I know that kind of sounds odd. I don't want to get too deep into that. But the point I'm making here Is that we change the context in which app that salespeople iterator is being executed.

And we also just simply reference the app global variable up here to solve our problem. Now, if you look, for example, in the five, there's another way we could do it, which is, we set a reference to this by creating a variable called me. And down here in line 21. We reference me so what happens is, once again, we change the context on which the app salespeople iterator is being executed. Now it's being executed in the context of app. So that means up here, we have reference to the app.

Variable, but we can reference it by this for example, if I were to do a console dare statement up here, on this line on line 17. We can see what this is on each execution of this function. So I'm going to go to troubleshooting example number five. execute that and I get 10 objects in my console. And each object is identical. It's the app object is going to show delete selected method and the salespeople iterator method.

They're the same object every time. And the reason we see that is because when we execute, they're trying to return this function gets executed. This on line 17, resolves to AP. And that's good. We like that, because then we can set a reference to this, which is me create a variable, and this function can see outside of itself because of lexical scoping. So we can say me dot show, delete selected.

Now, this is a little hacky. And if you have discovered ECMO script 2015, you may know by now that fat arrow functions essentially sought help solve this problem. So that's definitely a topic for a whole nother class we can get into fire functions. But for now, the point I'm trying to make is that we want to troubleshooting problems. We want to first determine if it's a scope problem or a context problem. And then once we know the answer to that question, we can kind of drill down and use different techniques to solve the problem.

But knowing what kind of problem it is really makes a big difference in terms of figuring out how are you going to go about finding out where the problem started and how to resolve it.

Sign Up

Share

Share with friends, get 20% off
Invite your friends to LearnDesk learning marketplace. For each purchase they make, you get 20% off (upto $10) on your next purchase.