Solution to the problem of var in for loop

Solution to the problem of var in for loop

Preface

var is a way to declare variables in ES5. I have always heard that when declaring variables with var, there is a problem of loop variables leaking to global variables, but I always can't figure out the impact of this "global". In addition, it is not clear when the output result is an increasing/decreasing value and when the output is the same value.

Problem reproduction

for (var i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i)
  }, i * 1000)
}

Expected result: 12345

Print result: 66666

Solution

Closures

for (var i = 1; i <= 5; i++) {
    (function (j) {
        setTimeout(function timer() {
            console.log(j)
        }, j * 1000)
    })(i)
}

setTimeout third parameter

for (var i = 1; i <= 5; i++) {
   setTimeout(
       function timer(j) {
           console.log(j)
       },
       i * 1000,
       i
   )
}

Use let to define i

for (let i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i)
    }, i * 1000)
}

let

Regarding let, remember: the current i is only valid in this loop, and i in each loop is actually a new variable.

The JavaScript engine will remember the value of the previous loop internally, and when initializing the variable i of this loop, it will perform calculations based on the previous loop.

In addition, the for loop has another special feature, that is, the part that sets the loop variable is a parent scope, and the loop body is a separate child scope.

for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
//abc
//abc
//abc

Summarize

This is the end of this article about how to solve the problems encountered when using var for loop. For more information about var for loop problems, please search for previous articles on 123WORDPRESS.COM or continue to browse the following related articles. I hope you will support 123WORDPRESS.COM in the future!

You may also be interested in:
  • js for loop, why must we add var to define i variable
  • The difference between var and let in jQuery for loop
  • Detailed explanation of the difference between let and var in es6 for loop

<<:  Explore the truth behind the reload process in Nginx

>>:  Detailed explanation of the code for querying data of a certain day, month, or year in MySQL

Recommend

js to implement verification code interference (static)

This article shares the specific code of js to im...

About the problem of dynamic splicing src image address of img in Vue

Let's take a look at the dynamic splicing of ...

Elegant practical record of introducing iconfont icon library into vue

Table of contents Preface Generate SVG Introducti...

Mysql sorting and paging (order by & limit) and existing pitfalls

Sorting query (order by) In e-commerce: We want t...

The specific use and difference between attribute and property in Vue

Table of contents As attribute and property value...

Explain TypeScript mapped types and better literal type inference

Table of contents Overview Using mapped types to ...

How to cancel the background color of the a tag when it is clicked in H5

1. Cancel the blue color of the a tag when it is ...

Detailed explanation of pure SQL statement method based on JPQL

JPQL stands for Java Persistence Query Language. ...

Calling Baidu Map to obtain longitude and latitude in Vue

In the project, it is necessary to obtain the lat...

How to implement Docker Registry to build a private image warehouse

The image of the microservice will be uploaded to...

How to Fix File System Errors in Linux Using ‘fsck’

Preface The file system is responsible for organi...

React uses emotion to write CSS code

Table of contents Introduction: Installation of e...

Detailed explanation of execution context and call stack in JavaScript

Table of contents 1. What is the execution contex...

Upgrade Docker version of MySQL 5.7 to MySQL 8.0.13, data migration

Table of contents 1. Back up the old MySQL5.7 dat...

MySQL Series 11 Logging

Tutorial Series MySQL series: Basic concepts of M...