邯郸网站建设最新报价,建设网站建设的目标,万江网站建设公司,平面设计都需要什么软件看了很多解释#xff0c;感觉都不好理解。这个文章是我自己的理解#xff0c;可以做个参考#xff0c;如果我理解的不对#xff0c;欢迎在评论区指正#xff1a; var#xff1a;使用var声明的变量具有全局作用域 #xff08;循环中每次声明的是同一个变量#xff09; l…看了很多解释感觉都不好理解。这个文章是我自己的理解可以做个参考如果我理解的不对欢迎在评论区指正 var使用var声明的变量具有全局作用域 循环中每次声明的是同一个变量 let使用let声明的变量具有局部作用域 循环中每次声明的是新的变量每次是新的作用域 为什么var使用的是同一个呢因为var可以变量提升let不可以 可以把for循环拆解成这样的代码去理解就通顺了
for(var i0;i2;i){setTimeout(()console.log(i),1000)
}// 相当于
var i; // 变量提升
function q(){i0;setTimeout(()console.log(i),0)
}
q();function w(){i1;setTimeout(()console.log(i),0)
}
w();function e(){i2;
}
e();
然后let可以拆解成这样
for(let i0;i2;i){setTimeout(()console.log(i),1000)
}// 相当于
function q(){let i0; // 变量提升不了setTimeout(()console.log(i),0)
}
q();function w(){let i1;setTimeout(()console.log(i),0)
}
w();function e(){let i2;
}
e(); var里面由于改变的都是同一个变量setTimeout引用的变量地址指向同一个值所以最后值是相同的。
let里面由于每次都开辟了一个新的内存空间setTimeout引用的变量地址指向的是不同的值所以最后值是不同的。 以上是对let解决方法的语意化如果使用闭包那么就转化为这样
for(var i0;i2;i){function(j){setTimeout(()console.log(j),0);})(i)
}var i; // 变量提升
function q(){i0; // 闭包(function(j){setTimeout(()console.log(j),0);})(i)
}
q();function w(){i1;(function(j){setTimeout(()console.log(j),0);})(i)
}
w();function e(){i2;
}
e();
如果说的不对欢迎指正