Javascript 在循环中使用相同的变量来求解;“循环中的闭包”;问题
在问题的继续部分,我尝试了以下代码,在两个循环中使用相同的变量,并得到了期望的结果。我的问题是,为什么 那么初始代码是:Javascript 在循环中使用相同的变量来求解;“循环中的闭包”;问题,javascript,for-loop,scope,closures,Javascript,For Loop,Scope,Closures,在问题的继续部分,我尝试了以下代码,在两个循环中使用相同的变量,并得到了期望的结果。我的问题是,为什么 那么初始代码是: 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
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
}
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
}
var funcs=[];
对于(var i=0;i<3;i++){//让我们创建3个函数
funcs[i]=function(){//并将它们存储在funcs中
log(“我的值:+i);//每个都应该记录其值。
};
}
对于(var j=0;j<3;j++){
funcs[j]();//这不会给出所需的输出
}
输出结果如下:
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
}
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
}
- 我的价值:3
- 我的价值:3
- 我的价值:3
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
}
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
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
}
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
}
var funcs=[];
对于(var i=0;i<3;i++){//让我们创建3个函数
funcs[i]=function(){//并将它们存储在funcs中
log(“我的值:+i);//每个都应该记录其值。
};
}
对于(i=0;i<3;i++){
funcs[i]();//这将提供所需的输出
}
我得到了预期的输出
- 我的价值:0
- 我的价值:1
- 我的价值:2
为什么?因为变量
i
被污染了。在代码段中,循环写入同一变量i
,函数读取该变量。请注意,代码中只有一个变量i
要获得预期结果,您真正需要的是“模块模式”,它包装了一个函数,以在循环中保留变量的本地副本:
for (var i=0; i<3; i++) {
(function (j) {
funcs[j] = function() { // and store them in funcs
console.log("My value: " + j); // each should log its value.
};
})(i);
}
(变量i=0;i)的
现在,如果我在第二个循环中使用变量'I'(一个全局变量)作为
嗯…我得到了预期的输出…为什么
因为在执行第一个执行循环时:
for (var j = 0; j < 3; j++) {
funcs[j]();
}
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]();
}
“使用严格”;//使用let需要严格模式
var funcs=[];
对于(let i=0;i<3;i++){//只需在这里用let替换var即可
funcs[i]=函数(){
console.log(“我的值:+i”);
};
}
对于(var j=0;j<3;j++){
funcs[j]();
}
现在,数组将由访问局部变量的函数构成,在将函数添加到数组时,局部变量被赋值为i
。因为i
是代码中的全局变量3,它是i的最后一个值,当调用itrewrite时,在for循环之前编写代码声明var i
一次s-因为这就是您实际正在做的,两个var i
实际上是相同的i
-很明显,“循环中的闭包”问题的整个要点是内部函数打印i
的当前值。如果您将第二个循环更改为例如for(var i=10;i<13;i++){
它应该变得更清晰。即使你把var i
放在全局范围内(至少属于for
s之外的范围)。试着将每个for
封装在一个函数中,那么不管你使用什么变量(甚至i
本身),你都会得到33
的结果。