Home Web Front-end JS Tutorial A brief discussion on closures in js_javascript skills

A brief discussion on closures in js_javascript skills

May 16, 2016 pm 04:09 PM
js Closure

First, let’s look at a piece of code:

Copy code The code is as follows:

111
222
333
var a=document.getElementsByTagName("a");
function b(){
  for(var i=0;i   a[i].onclick=function(){
alert(i);
  } 
}
}

According to the original intention of our design, clicking on an a tag should pop up the serial number of the tag accordingly, that is, clicking on the first a will pop up 0, clicking on the second a will pop up 1... But in fact it pops up. It is always the number of a tags. What is the reason? This problem has troubled me for a long time. I have consulted a lot of online information and reference books, and most of them are specious. I believe that many students do not understand the reasons. I will talk about my own understanding of this issue. If there is any inappropriateness, , please criticize and correct me.

From my personal understanding, the reason why the above function fails to achieve its purpose is that the event processing function is bound to the variable i, and the event processing function is assigned to onclick, which means that it is only activated when the a tag is clicked. This function will be called, so logically speaking, the function(){alert(i);} in a simple for loop is actually not executed, and when we click the a label, the for loop has already After execution is completed, the value of i at this time is the final value of the for loop. A simple understanding is that the value of i belongs to the b function, and the value of i we need is the value passed into the event processing function in real time. So is there any way to achieve our original design intention? Smart students may have guessed that it is to use closures.

Let’s look at another piece of code:

Copy code The code is as follows:

var a=document.getElementsByTagName("a");
function b(){
  for(var i=0;i    a[i].onclick=function(j){
    return function(){
alert(j);
   }
  }(i);
}
}
b();

Executing the above code, you can find that the function we want has been implemented, that is, clicking on any a label will pop up the serial number where the label is located. Regarding the above code, I believe many students have seen many similar versions, but why can we achieve the functions we need by doing this? This is just my personal opinion. If there is anything wrong, please feel free to enlighten me.

The essence of the understanding of the above code is the understanding of variable i. In this code, the function executes to the for loop and finds an immediately called function. At this time, the real-time i variable value is passed to the immediately called function. The function is called immediately, and the event processing function also stores the real-time i variable value. .

The above is the entire content of this article. I hope it will be helpful to everyone in understanding js closures.

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Have Crossplay?
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Recommended: Excellent JS open source face detection and recognition project Recommended: Excellent JS open source face detection and recognition project Apr 03, 2024 am 11:55 AM

Face detection and recognition technology is already a relatively mature and widely used technology. Currently, the most widely used Internet application language is JS. Implementing face detection and recognition on the Web front-end has advantages and disadvantages compared to back-end face recognition. Advantages include reducing network interaction and real-time recognition, which greatly shortens user waiting time and improves user experience; disadvantages include: being limited by model size, the accuracy is also limited. How to use js to implement face detection on the web? In order to implement face recognition on the Web, you need to be familiar with related programming languages ​​and technologies, such as JavaScript, HTML, CSS, WebRTC, etc. At the same time, you also need to master relevant computer vision and artificial intelligence technologies. It is worth noting that due to the design of the Web side

What is the meaning of closure in C++ lambda expression? What is the meaning of closure in C++ lambda expression? Apr 17, 2024 pm 06:15 PM

In C++, a closure is a lambda expression that can access external variables. To create a closure, capture the outer variable in the lambda expression. Closures provide advantages such as reusability, information hiding, and delayed evaluation. They are useful in real-world situations such as event handlers, where the closure can still access the outer variables even if they are destroyed.

How to implement closure in C++ Lambda expression? How to implement closure in C++ Lambda expression? Jun 01, 2024 pm 05:50 PM

C++ Lambda expressions support closures, which save function scope variables and make them accessible to functions. The syntax is [capture-list](parameters)->return-type{function-body}. capture-list defines the variables to capture. You can use [=] to capture all local variables by value, [&] to capture all local variables by reference, or [variable1, variable2,...] to capture specific variables. Lambda expressions can only access captured variables but cannot modify the original value.

What are the advantages and disadvantages of closures in C++ functions? What are the advantages and disadvantages of closures in C++ functions? Apr 25, 2024 pm 01:33 PM

A closure is a nested function that can access variables in the scope of the outer function. Its advantages include data encapsulation, state retention, and flexibility. Disadvantages include memory consumption, performance impact, and debugging complexity. Additionally, closures can create anonymous functions and pass them to other functions as callbacks or arguments.

Solve the memory leak problem caused by closures Solve the memory leak problem caused by closures Feb 18, 2024 pm 03:20 PM

Title: Memory leaks caused by closures and solutions Introduction: Closures are a very common concept in JavaScript, which allow internal functions to access variables of external functions. However, closures can cause memory leaks if used incorrectly. This article will explore the memory leak problem caused by closures and provide solutions and specific code examples. 1. Memory leaks caused by closures The characteristic of closures is that internal functions can access variables of external functions, which means that variables referenced in closures will not be garbage collected. If used improperly,

The relationship between js and vue The relationship between js and vue Mar 11, 2024 pm 05:21 PM

The relationship between js and vue: 1. JS as the cornerstone of Web development; 2. The rise of Vue.js as a front-end framework; 3. The complementary relationship between JS and Vue; 4. The practical application of JS and Vue.

The impact of function pointers and closures on Golang performance The impact of function pointers and closures on Golang performance Apr 15, 2024 am 10:36 AM

The impact of function pointers and closures on Go performance is as follows: Function pointers: Slightly slower than direct calls, but improves readability and reusability. Closures: Typically slower, but encapsulate data and behavior. Practical case: Function pointers can optimize sorting algorithms, and closures can create event handlers, but they will bring performance losses.

Chained calls and closures of PHP functions Chained calls and closures of PHP functions Apr 13, 2024 am 11:18 AM

Yes, code simplicity and readability can be optimized through chained calls and closures: chained calls link function calls into a fluent interface. Closures create reusable blocks of code and access variables outside functions.

See all articles