Troubleshooting a Scope Problem

6 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
€94.93
List Price:  €132.91
You save:  €37.97
£79.03
List Price:  £110.65
You save:  £31.61
CA$140.06
List Price:  CA$196.09
You save:  CA$56.03
A$153.89
List Price:  A$215.46
You save:  A$61.56
S$134.42
List Price:  S$188.19
You save:  S$53.77
HK$778.15
List Price:  HK$1,089.44
You save:  HK$311.29
CHF 88.46
List Price:  CHF 123.85
You save:  CHF 35.38
NOK kr1,106.89
List Price:  NOK kr1,549.69
You save:  NOK kr442.80
DKK kr708.13
List Price:  DKK kr991.41
You save:  DKK kr283.28
NZ$169.76
List Price:  NZ$237.67
You save:  NZ$67.91
د.إ367.26
List Price:  د.إ514.19
You save:  د.إ146.92
৳11,913.94
List Price:  ৳16,679.99
You save:  ৳4,766.05
₹8,449.26
List Price:  ₹11,829.30
You save:  ₹3,380.04
RM444.65
List Price:  RM622.53
You save:  RM177.88
₦168,698.12
List Price:  ₦236,184.12
You save:  ₦67,486
₨27,703.14
List Price:  ₨38,785.50
You save:  ₨11,082.36
฿3,443.25
List Price:  ฿4,820.69
You save:  ฿1,377.44
₺3,462.60
List Price:  ₺4,847.78
You save:  ₺1,385.18
B$598.25
List Price:  B$837.57
You save:  B$239.32
R1,818.71
List Price:  R2,546.27
You save:  R727.55
Лв185.54
List Price:  Лв259.76
You save:  Лв74.22
₩139,623.30
List Price:  ₩195,478.21
You save:  ₩55,854.90
₪365.09
List Price:  ₪511.14
You save:  ₪146.05
₱5,872.56
List Price:  ₱8,221.82
You save:  ₱2,349.26
¥15,186.98
List Price:  ¥21,262.38
You save:  ¥6,075.40
MX$2,025.91
List Price:  MX$2,836.36
You save:  MX$810.44
QR363.39
List Price:  QR508.76
You save:  QR145.37
P1,362.02
List Price:  P1,906.89
You save:  P544.86
KSh12,948.70
List Price:  KSh18,128.70
You save:  KSh5,180
E£4,970.06
List Price:  E£6,958.29
You save:  E£1,988.22
ብር12,601.88
List Price:  ብር17,643.14
You save:  ብር5,041.25
Kz91,089.09
List Price:  Kz127,528.37
You save:  Kz36,439.28
CLP$97,725.22
List Price:  CLP$136,819.22
You save:  CLP$39,094
CN¥725.08
List Price:  CN¥1,015.15
You save:  CN¥290.06
RD$6,009.89
List Price:  RD$8,414.09
You save:  RD$2,404.19
DA13,359.34
List Price:  DA18,703.61
You save:  DA5,344.27
FJ$226.94
List Price:  FJ$317.73
You save:  FJ$90.78
Q769.20
List Price:  Q1,076.91
You save:  Q307.71
GY$20,858.96
List Price:  GY$29,203.38
You save:  GY$8,344.42
ISK kr13,737.62
List Price:  ISK kr19,233.22
You save:  ISK kr5,495.60
DH998.96
List Price:  DH1,398.59
You save:  DH399.62
L1,830.82
List Price:  L2,563.22
You save:  L732.40
ден5,834.63
List Price:  ден8,168.72
You save:  ден2,334.08
MOP$798.95
List Price:  MOP$1,118.57
You save:  MOP$319.61
N$1,808.86
List Price:  N$2,532.48
You save:  N$723.61
C$3,668.81
List Price:  C$5,136.49
You save:  C$1,467.67
रु13,468.97
List Price:  रु18,857.10
You save:  रु5,388.12
S/375.25
List Price:  S/525.36
You save:  S/150.11
K402.01
List Price:  K562.83
You save:  K160.82
SAR375.60
List Price:  SAR525.86
You save:  SAR150.25
ZK2,719.29
List Price:  ZK3,807.12
You save:  ZK1,087.82
L472.45
List Price:  L661.45
You save:  L189
Kč2,399.23
List Price:  Kč3,359.02
You save:  Kč959.78
Ft39,362.83
List Price:  Ft55,109.54
You save:  Ft15,746.71
SEK kr1,093.94
List Price:  SEK kr1,531.56
You save:  SEK kr437.61
ARS$100,789.45
List Price:  ARS$141,109.26
You save:  ARS$40,319.81
Bs688.98
List Price:  Bs964.60
You save:  Bs275.62
COP$439,886.78
List Price:  COP$615,859.09
You save:  COP$175,972.31
₡50,922.11
List Price:  ₡71,293
You save:  ₡20,370.88
L2,521.57
List Price:  L3,530.31
You save:  L1,008.73
₲779,303.12
List Price:  ₲1,091,055.54
You save:  ₲311,752.42
$U4,282.79
List Price:  $U5,996.09
You save:  $U1,713.29
zł409.03
List Price:  zł572.67
You save:  zł163.63
Already have an account? Log In

Transcript

In the examples folder, open up the troubleshooting sub folder. And let's look at troubleshooting example one. So here I'm going to iterate over all of the salespeople list items. And I'm doing it in kind of a kind of an old school way. And then I'm creating an AI variable and setting a reference to the sale, the list items or the list of salespeople, DOM elements by using the dot document, query selector all it's not particularly fancy, but there's a reason why I'm doing it this way. So I create a for loop, which is again, just kind of a really old school way of iterating something and inside that for loop on looking for the Create a reference to the salesperson, so I say var item equals salesperson eyes.

So first is going to be salesperson zero, salesperson, one, salesperson, two, and so forth. And then I'm saying item, find that the select button so find a select button for that item, and then I set up a click event handler for that item. So in the And the user clicks that Select button. I'm going to use this find variable as item variable to find the D Select button and show it. I'm going to first hide the select button, show the dislike button and toggle the selected class. So let's see how we make out here.

I'm going to go to show examples and go to troubleshooting sample number one. Okay, so run that code, and then I click the first this first select button. So the diesel let's delete Select button shows the selected the select button that I clicked one away. But I'm not seeing the D Select button for each list item and it's not toggling the selected class or the list is not turning green as I expected. So if we zoom out a little bit, I want to show you something really odd that's happening here. As I watch what happens I click each Select button.

The last list item is toggling it's going green and then not green, green and then not green. So for some reason, every time we click a select button, a, we're having a couple of problems. And the main problem is that we're not seeing the D Select button for that item. And the last element in the list is toggling, which is not what we want. We want the item that we're clicking to be toggling. So let's see if we can figure out the problem.

Well, the first question we need to ask ourself is, is this a scope problem or a context problem? always the most important question. So I'm thinking about things and I'm thinking well, the funky thing that was happening was the last element in the list was toggling, but none of the other ones were and I'm iterating over a list and I'm using a variable that counts up. I started zero and it goes up to the value of salespeople dot length are tells you all that length minus one. So I'm thinking that Well, if the last one, if AI is incrementing, and only the last element is toggling, then maybe there's a problem with AI and AI is, is variable, that's for sure. So when I think variables, I think scope.

So why don't we do this? Let's put a console a console statement inside a click event handler, which is going to output the value of i. So I'm thinking that on each click, I should show like if I click the very first element in the list, I should see, you know, I equals zero. If I click the second element, I should see i equals one. If I click the ninth element, I should see i equals nine, and so forth. Because this click event handler is referencing you know, I, we created this item object by referencing salespeople eyes, so we definitely need to know that we're getting the correct value of i for each.

Click. So let's refresh the page and see how we make out so I'm going to start clicking And when I click each button, I noticed that it just says i equals 10. Every time I equals 10, I'm thinking it should say i equals zero, I equals one, I equals two equals three, but it's just I equal 10. And it kind of lines up with what we're seeing, which is, the last item in the list is toggling, not the item we're clicking with the last item in the list. So I'm thinking that AI is not what we think it is. And it turns out that's correct.

Because what happens is, even though we're, we're iterating over i going from zero to nine, the problem is that this click event handler could happen. You know, the iteration happens in, you know, microseconds, but milliseconds, but the click event handler, the user might click the button in a minute or 10 minutes or 10 hours. But that reference to AI does not is not cached with each iteration of this list. It they all find are off and when you start clicking the clicking the buttons is 10. So we need a way to protect it or create a scoped version of it. So if we go back to the page and run troubleshooting example, number two, and start clicking around, I think you'll notice that everything works exactly as expected.

If you click an element, the the select button shows and it toggles green. And the last element only behaves that way. If you click it, so we're getting the behavior that we expected. The question is why? Well, the reason that happened is because if you look at troubleshooting example two, what we did was we used an immediate invoked function expression, or an immediate function here, and we we get this item. And we pass it into the function.

And then we have our code. So basically, our code gets a privately scoped version of that item. And that's preserves that when the element the select button is actually clicked. We've got Zero I one, I two, I three. Now, I don't want to get really too much into immediate functions and closures, because that's definitely stuff that we could have an entire class on. But the point I'm making here is that we asked ourselves the question, is this a scope problem or a context problem?

And through a little bit of logic, we determined it was a scope problem. And that allowed us to quickly drill down and figure out where the problem was happening, and how to solve it. Even if we didn't have the answer of how to solve it right now, at least finding out what the problem is. It wasn't a context problem. It was a scope problem. And that's the thing that's really important in this case was determining that For this example, this was a scope problem, and it was solved by creating the properly scoped version of I or this item object that we wanted to pass into our click event handler.

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.