我需要一些解释来清楚地了解这里发生了什么;Javascript:异步执行范围(使用回调)
我们有这两个代码示例,第一个登录到控制台-1五次,这是因为对于循环执行完全值为-1离开我,然后才做回调开始执行。问题 是,当他们执行时,我已经有值-1。
第二个样本记录了预期结果,即5比1倒数。两个样本之间的唯一区别是,我不再声明countdown()
函数的范围,但为什么会更改执行和我在第二个样本中处理的价值如何?
代码示例#1
function countdown() {
let i; // note we declare let outside of the for loop
console.log("Countdown:");
for(i=5; i>=0; i--) {
setTimeout(function() {
console.log(i===0 ? "GO!" : i);
}, (5-i)*1000);
}
}
countdown();
代码示例#2
function countdown() {
console.log("Countdown:");
for(let i=5; i>=0; i--) { // i is now block-scoped
setTimeout(function() {
console.log(i===0 ? "GO!" : i);
}, (5-i)*1000);
}
}
countdown();
所不同的是的'i'对1的代码的第一位做同样的事情如'变种i'将6个实例。它的作用范围在于函数,因此,函数中的每个对'i'的引用(包括'i - ')都是相同的变量。然而,在#2中,它会为循环的每次迭代创建一个新变量,其值等于循环迭代执行时的任何“i”值,* not * console.log时的“i”值是多少() 叫做。 – mhodges