A sample discussion of loop binding for javascript closure arguments and events
- 2020-03-30 02:41:07
- OfStack
Today, I saw a javascript problem binding events in a normal loop, but the result was not what I wanted.
1. This code clicks on the link to bring up the I is -1, why is this?
Function () {alert(I); Return false; } as a function a(); A () the variable I is not defined internally, but it is used internally, so it looks outside and finds the I defined in the for loop. The click event is executed after the for loop is completed, and the value of I has become -1 after the execution; So every time it pops up it's going to be -1;
2. Two-parameter for loop is also not common! Confused?
For (statement 1, statement 2, statement 3) {
/ / todo
}
A.f or loop conditions
Statements 1, 2, and 3 are usually optional.
B. Statement 2:
Statement 2 is typically used to evaluate the condition of the initial variable.
Statement 2 is also optional.
If statement 2 returns true, the loop starts again, and if statement 2 returns false, the loop ends.
Tip: if you omit statement 2, you must provide the break within the loop. Otherwise the cycle cannot stop. This can cause the browser to crash.
C. about I -- judgment:
When you say I --true /false, you say I before you do I. So the last time you say I -- when you say I ==0, you actually say I ==0, and then you say I -- again, the for loop ends, so the value of I becomes negative 1;
Var I = 1;
!!!!! I -; / / true
Solutions:
Or:
Solution demo in other netizens 7:
1. Save the variable I on each paragraph object (p)
2. Save the variable I in the anonymous function itself
3, add a layer of closure, I in the form of function parameters passed to the inner function
4. Add a layer of closure, and I is passed to the memory function as a local variable
5. Add a layer of closures and return a function as a response event (note the subtle difference from 3)
6, with the Function implementation, each Function instance will actually produce a closure
7, use Function to realize, notice the difference with 6
Summary completed, welcome to clap brick!
<a href="#">text</a>
<br>
<a href="#">link</a>
<script>
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
as[i].onclick = function() {
alert(i);
return false;
}
}
</script>
1. This code clicks on the link to bring up the I is -1, why is this?
Function () {alert(I); Return false; } as a function a(); A () the variable I is not defined internally, but it is used internally, so it looks outside and finds the I defined in the for loop. The click event is executed after the for loop is completed, and the value of I has become -1 after the execution; So every time it pops up it's going to be -1;
2. Two-parameter for loop is also not common! Confused?
For (statement 1, statement 2, statement 3) {
/ / todo
}
A.f or loop conditions
Statements 1, 2, and 3 are usually optional.
B. Statement 2:
Statement 2 is typically used to evaluate the condition of the initial variable.
Statement 2 is also optional.
If statement 2 returns true, the loop starts again, and if statement 2 returns false, the loop ends.
Tip: if you omit statement 2, you must provide the break within the loop. Otherwise the cycle cannot stop. This can cause the browser to crash.
C. about I -- judgment:
When you say I --true /false, you say I before you do I. So the last time you say I -- when you say I ==0, you actually say I ==0, and then you say I -- again, the for loop ends, so the value of I becomes negative 1;
Var I = 1;
!!!!! I -; / / true
Solutions:
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
(function(i){
as[i].onclick = function() {
alert(i);
return false;
}
})(i)
}
Or:
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
var a = function(i){
as[i].onclick = function() {
alert(i);
return false;
}
}
a(i);
}
Solution demo in other netizens 7:
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title> Closure demo </title>
<script type="text/javascript">
function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function() {
alert(i);
}
}
}
</script>
</head>
<body onload="init();">
<p> Products a </p>
<p> The second product </p>
<p> Three products </p>
<p> Four products </p>
<p> The product of five </p>
</body>
</html>
1. Save the variable I on each paragraph object (p)
function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].i = i;
pAry[i].onclick = function() {
alert(this.i);
}
}
}
2. Save the variable I in the anonymous function itself
function init2() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(pAry[i].onclick = function() {
alert(arguments.callee.i);
}).i = i;
}
}
3, add a layer of closure, I in the form of function parameters passed to the inner function
function init3() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(function(arg){
pAry[i].onclick = function() {
alert(arg);
};
})(i);//Call-time parameter
}
}
4. Add a layer of closure, and I is passed to the memory function as a local variable
function init4() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(function () {
var temp = i;//Local variables when invoked
pAry[i].onclick = function() {
alert(temp);
}
})();
}
}
5. Add a layer of closures and return a function as a response event (note the subtle difference from 3)
function init5() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function(arg) {
return function() {//Returns a function
alert(arg);
}
}(i);
}
}
6, with the Function implementation, each Function instance will actually produce a closure
function init6() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = new Function("alert(" + i + ");");//New generates one instance of the function at a time
}
}
7, use Function to realize, notice the difference with 6
function init7() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = Function('alert('+i+')')
}
}
Summary completed, welcome to clap brick!