编程语言
首页 > 编程语言> > javascript-在循环中使用相同的变量来解决“循环中的闭包”问题

javascript-在循环中使用相同的变量来解决“循环中的闭包”问题

作者:互联网

继续进行到this的问题,我尝试了以下在两个循环中使用相同变量的代码,并获得了预期的结果.我的问题是,为什么?

因此,初始代码为:

 var funcs = [];

 for (var i = 0; i < 3; i++) {      // let's create 3 functions
  funcs[i] = function() {          // and store them in funcs
    console.log("My value: " + i); // each should log its value.
  };
 }

 for (var j = 0; j < 3; j++) {
  funcs[j]();                      // this will not give desired output
 }

输出如下:

>我的价值:3
>我的价值:3
>我的价值:3

而预期的输出是:

>我的值:0
>我的价值:1
>我的价值:2

现在,如果在第二个循环中也使用变量“ i”(全局变量),则代码如下所示:

var funcs = [];

for (var i = 0; i < 3; i++) {      // let's create 3 functions
  funcs[i] = function() {          // and store them in funcs
    console.log("My value: " + i); // each should log its value.
  };
}

for ( i = 0; i < 3; i++) {
  funcs[i]();                      // this gives desired output
}

我得到了预期的输出,

>我的值:0
>我的价值:1
>我的价值:2

为什么?

解决方法:

Now, if I use variable ‘i’ (a global variable) in the second loop as
well … I get the intended output … WHY?

因为当您执行第一个执行循环时:

for (var j = 0; j < 3; j++) {
  funcs[j]();                      
 }

构造数组的循环已经完成,全局变量i的值为3,因此console.log(i)会在第一个执行循环的每次迭代中将3记录到控制台.当您执行第二个执行循环时:

for ( i = 0; i < 3; i++) {
  funcs[i]();                      
}

您为循环的每次迭代分配一个新值给全局变量i,而console.log(i)将记录到控制台的正是这个新值:0、1、2.

您如何以简单的方式达到预期的效果?

您可以使用let通过简单的方式获得所需的结果:

"use strict"; // use of let requires strict mode

var funcs = [];

 for (let i = 0; i < 3; i++) { // just replace var with let here     
  funcs[i] = function() {          
    console.log("My value: " + i); 
  };
 }

 for (var j = 0; j < 3; j++) {
  funcs[j]();                     
 }

现在,将使用可以访问局部变量的函数来构造该数组,该局部变量在将函数添加到数组时会被分配i的值.

标签:scope,for-loop,closures,javascript
来源: https://codeday.me/bug/20191111/2022297.html