


Detailed explanation of how to write and function closures in JavaScript
1. What is a closure
A closure is a function that has access to a variable in the scope of another function.
Simply put, Javascript allows the use of internal functions---that is, function definitions and function expressions are located in the function body of another function. Furthermore, these inner functions have access to all local variables, parameters, and other inner functions declared in the outer function in which they exist. A closure is formed when one of these inner functions is called outside the outer function that contains them.
2. The scope of variables
To understand closures, you must first understand the scope of variables.
The scope of variables is nothing more than two types: global variables and local variables.
The special thing about Javascript language is that global variables can be read directly inside the function.
The internal function can access the variables of the external function because the scope chain of the internal function includes the scope of the external function;
can also be understood as: the scope of the internal function It radiates to the scope of the external function;
1 2 3 4 5 |
|
On the other hand, the local variables within the function cannot be read outside the function.
1 2 3 4 |
|
There is one thing to note here. When declaring variables inside a function, you must use the var command. If you don't use it, you are actually declaring a global variable!
1 2 3 4 5 |
|
3. Several ways to write and use closures
3.1. Add some attributes to the function
1 2 3 4 5 6 7 8 9 |
|
3.2. Declare a variable and treat a function as a value Assign to variable
1 2 3 4 5 6 7 8 9 10 11 |
|
3.3. This method is commonly used and is the most convenient. var obj = {} is to declare an empty object
1 2 3 4 5 6 7 |
|
4. The main function of closure
Closure can be used in many places. Its greatest uses are two: one is to read the variables inside the function as mentioned earlier, and the other is to keep the values of these variables in memory.
4.1. How to read local variables from the outside?
For various reasons, we sometimes need to get local variables within a function. However, as mentioned before, this is not possible under normal circumstances and can only be achieved through workarounds.
That is to define another function inside the function.
1 2 3 4 5 6 |
|
In the above code, function f2 is included inside function f1. At this time, all local variables inside f1 are visible to f2. But the reverse doesn't work. The local variables inside f2 are invisible to f1. This is the "chain scope" structure unique to the Javascript language. The child object will search for the variables of all parent objects level by level. Therefore, all variables of the parent object are visible to the child object, but not vice versa.
Since f2 can read the local variables in f1, then as long as f2 is used as the return value, can't we read its internal variables outside f1?
1 2 3 4 5 6 7 8 9 |
|
4.2. How to keep the value of a variable in memory?
1 2 3 4 5 6 7 8 9 10 11 12 |
|
In this code, result is actually the closure f2 function. It was run twice, the first time the value was 999, the second time the value was 1000. This proves that the local variable n in function f1 is always stored in memory and is not automatically cleared after f1 is called.
Why is this so? The reason is that f1 is the parent function of f2, and f2 is assigned to a global variable, which causes f2 to always be in memory, and the existence of f2 depends on f1, so f1 is always in memory and will not be deleted after the call is completed. , recycled by the garbage collection mechanism (garbage collection).
Another thing worth noting in this code is the line "nAdd=function(){n+=1}". First of all, the var keyword is not used before nAdd, so nAdd is a global variable. rather than local variables. Secondly, the value of nAdd is an anonymous function, and this anonymous function itself is also a closure, so nAdd is equivalent to a setter, which can operate on local variables inside the function outside the function.
5. Closure and this object
Using this object in a closure may cause some problems. Because the execution of anonymous functions is global, its this object usually points to window. The code is as follows:
1 2 3 4 5 6 7 8 9 10 |
|
Save the this object in the external scope in a variable that can be accessed by the closure Inside, you can let the closure access the object. The code is as follows:
1 2 3 4 5 6 7 8 9 10 11 |
|
6. Closures and memory leaks
Specifically, if an HTML element is stored in the scope of the closure, it means that the element cannot be destroyed. As follows:
1 2 3 4 5 6 |
|
The above code creates a closure as the element event handler, and this closure creates a circular reference. Since the anonymous function saves a reference to the active object of assignHandler(), the number of references to element cannot be reduced. As long as the anonymous function exists, the reference number of element is at least 1, so the memory occupied by it will not be recycled.
Solve the problem of internal non-recyclability by rewriting the code:
1 2 3 4 5 6 7 8 |
|
The above code implements closures that do not directly reference element, and a reference will still be saved in the active object containing the function. Therefore, it is necessary to set the element variable to null so that the memory it occupies can be recycled normally.
7. Points to note when using closures
1) Since closures will cause the variables in the function to be stored in memory, which consumes a lot of memory, closures cannot be abused, otherwise it will cause performance problems on the web page, and may cause memory leaks in IE. The solution is to delete all unused local variables before exiting the function.
2) The closure will change the value of the variable inside the parent function outside the parent function. Therefore, if you use the parent function as an object, the closure as its public method, and the internal variables as its private value, you must be careful not to Feel free to change the value of the variable inside the parent function.
The above is the detailed explanation of the writing and function of closures in JavaScript introduced by the editor. I hope it will be helpful to you. If you have any questions, please leave me a message and the editor will reply to you in time. . I would also like to thank you all for your support of the PHP Chinese website!
For more detailed explanations of the writing and functions of closures in JavaScript, please pay attention to the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Frequently Asked Questions and Solutions for Front-end Thermal Paper Ticket Printing In Front-end Development, Ticket Printing is a common requirement. However, many developers are implementing...

There is no absolute salary for Python and JavaScript developers, depending on skills and industry needs. 1. Python may be paid more in data science and machine learning. 2. JavaScript has great demand in front-end and full-stack development, and its salary is also considerable. 3. Influencing factors include experience, geographical location, company size and specific skills.

JavaScript is the cornerstone of modern web development, and its main functions include event-driven programming, dynamic content generation and asynchronous programming. 1) Event-driven programming allows web pages to change dynamically according to user operations. 2) Dynamic content generation allows page content to be adjusted according to conditions. 3) Asynchronous programming ensures that the user interface is not blocked. JavaScript is widely used in web interaction, single-page application and server-side development, greatly improving the flexibility of user experience and cross-platform development.

How to merge array elements with the same ID into one object in JavaScript? When processing data, we often encounter the need to have the same ID...

In-depth discussion of the root causes of the difference in console.log output. This article will analyze the differences in the output results of console.log function in a piece of code and explain the reasons behind it. �...

Discussion on the realization of parallax scrolling and element animation effects in this article will explore how to achieve similar to Shiseido official website (https://www.shiseido.co.jp/sb/wonderland/)...

Learning JavaScript is not difficult, but it is challenging. 1) Understand basic concepts such as variables, data types, functions, etc. 2) Master asynchronous programming and implement it through event loops. 3) Use DOM operations and Promise to handle asynchronous requests. 4) Avoid common mistakes and use debugging techniques. 5) Optimize performance and follow best practices.

Explore the implementation of panel drag and drop adjustment function similar to VSCode in the front-end. In front-end development, how to implement VSCode similar to VSCode...
