- Overview
- Transcript
6.6 Closures
Closures are seen by some as a complex and difficult concept to learn. We'll blast that myth away in this lesson and learn how easy they are to use.
1.Introduction2 lessons, 07:42
1.1Introduction02:12
1.2Setup05:30
2.Language Fundamentals8 lessons, 1:00:53
2.1Variables06:33
2.2Data Types11:28
2.3Arithmetic, Assignment, and Comparison Operators10:24
2.4Unary, Logical, Comma, and Spread Operators09:02
2.5Operator Precedence03:50
2.6Reserved Words04:17
2.7Strict Mode04:34
2.8Functions10:45
3.Data Structures5 lessons, 22:52
3.1Arrays04:29
3.2Objects04:30
3.3Sets04:57
3.4Maps04:21
3.5Weak Maps and Weak Sets04:35
4.Controlling Program Execution7 lessons, 37:06
4.1Conditionals07:49
4.2Switch Statements04:41
4.3The For Loop06:39
4.4The `for .. in` Loop05:17
4.5The `for .. of` Loop04:02
4.6Iterators05:03
4.7While Loops03:35
5.Using JavaScript13 lessons, 1:44:36
5.1Working With Strings09:32
5.2Template Literals05:46
5.3Working With Numbers06:57
5.4Working With Arrays12:53
5.5Iterating and Transforming Arrays07:33
5.6Working With the Object Type13:55
5.7Object Literal Extensions06:45
5.8Working With Object Instances06:45
5.9Getters and Setters05:00
5.10Custom Objects11:28
5.11The `Math` API04:54
5.12Working With Dates and Times08:10
5.13The `Array` Constructor04:58
6.Functions8 lessons, 56:07
6.1The `this` Object06:15
6.2Working With Functions10:11
6.3Scope07:37
6.4Arrow Functions06:59
6.5Generator Functions08:13
6.6Closures05:00
6.7Prototypes06:26
6.8Default and Rest Parameters05:26
7.Miscellaneous6 lessons, 52:39
7.1Destructuring Assignments08:09
7.2AJAX08:30
7.3Regular Expressions10:51
7.4More About Regular Expressions08:38
7.5Classes06:48
7.6ES Modules09:43
8.Working With the DOM6 lessons, 37:39
8.1Selecting HTML Elements05:02
8.2Manipulating HTML Elements07:40
8.3DOM Traversal05:25
8.4Adding and Removing Elements04:45
8.5Creating Elements and Other Nodes04:39
8.6DOM Events10:08
9.Web APIs4 lessons, 17:41
9.1The Selector API03:03
9.2Geolocation05:29
9.3Web Storage05:24
9.4Web Workers03:45
10.Asynchronous JavaScript5 lessons, 26:23
10.1Promises09:52
10.2Promise Chaining05:11
10.3The async Keyword03:21
10.4The await Keyword04:04
10.5More About async and await03:55
11.Conclusion1 lesson, 00:43
11.1Conclusion00:43
6.6 Closures
Hi folks, in this lesson we're going to take a look at one of JavaScript's most misunderstood and feared features, the Closure. But don't worry, we have nothing to fear from the Closure. Although they are seen as an advanced feature of the language, the premise behind them is actually quite straightforward. Earlier in the course, we looked at scope in JavaScript. And we learned that it refer to the pose of our code in which variables are visible and accessible. As we know, variables declare outside of any function have global scope, which means that they can be used or accessed anywhere in our own scripts, or anywhere in other scripts attached to the page. Variables defined inside functions, on the other hand, are only visible within that function, including within other functions inside that function. The ability to create closures is simply a result of the fact that we can create functions inside of other functions. These functions are known as inner functions. A closure is just an inner function that remembers all of the variables in the scope of the outer function that it's within. This may not seem like a big deal when explained in such times. But recall that once a function returns, it's scope is usually destroyed. This is where the term closure comes from. The inner function closes over the scope that it is contained within, preventing that scope from being destroyed. Let's look at an example to illustrate how closures are formed, and how they behave. First of all let's create a new constructor function that represents an order in a store. At this point it's just a regular constructor, there's nothing special about it at all, there's no closure. But now let's have the constructor return a function. We return a function called addProduct, although the name of the function is only useful for debugging purposes. This function accepts a single parameter called price. Inside of the function then, let's compute a sales tax and a fee, and then add these to the price to create a total. So inside the addProduct function, we calculate a sales tax and a fee, which are both based on the price. We then add the price, the sales tax, and the fee to the total, which was specified as a variable inside of the outer order function. So the order function is the outer function in this case, and the addProduct function is the inner function. So now we can create the closure. So in this statement, we simply invoke the constructor, and store the return value in a variable. Remember that the return value of the constructor is the function addProduct. So the outer function at this point has returned. By all reasonable assumption, it's scope should have been destroyed, including the total variable which exists within it's scope. But because the constructor returns a function, something special happens, as we can see if we invoke the function that got returned. Let's now check the output in our browser. We don't see any errors, we see some values. And those values are the results of evoking the addProduct function, which got returned from the constructor. The inner function, addProduct, created a closure, and that closure protected the total variable, which was in the order constructor's scope. So even after the order constructor had returned, The inner function addProduct protected the total variable. And each time we invoke the addProduct method, the total variable is accessible through this closure. With closures, what's important isn't the environment when the function is invoked, but the environment that existed when the function was created. So in this lesson we looked at closures in JavaScript, and we saw that despite being considered an advanced feature of the language, they are nothing more than information about a scope, and a function that remembers that scope. We learned that when a function returns or creates another function, the inner function remembers all of the variables in scope when the function was defined. In the next lesson we're going to move on and look at prototypes again, this time in a bit more detail. Thanks for watching.