让我澄清我的问题。我不是在问如何使以下代码工作。我知道你可以使用let关键字或捕获自己值的iffe i
。我只需要澄清以下代码中如何访问值i
。我读了以下博客文章,了解到以下代码为什么不起作用。博客文章
for (var i = 1; i <= 5; i++) {
setTimeout(function() { console.log(i); }, 1000*i); // 6 6 6 6 6
}
作者声称代码无法工作,因为我们将变量i作为引用而不是值传递。也就是说,在每次迭代中,我们提供变量i的值,而不是将其作为引用提供给
setTimeout
中的回调函数。实际上,当循环终止并触发回调时,我们将引用变量i,其值将为6。这就是它的工作原理吗?这是我的理解。我的理解是,在执行循环时,我们没有向
setTimeout
的回调函数“传递”任何内容,我们只是设置异步调用。当闭包回调函数执行时,根据词法作用域规则,它们会查找变量i。也就是说,闭包在其闭包范围内查找变量,而在这种情况下,由于它是在for
循环完成后执行的,因此其值为6。到底是哪个原因导致函数将变量i的值解析为6?是因为在每次迭代中将变量作为引用传递还是因为词法作用域?
setTimeout(console.log(eval(i)));
。 - JMPeval()
- 当然包括这个。 - Scott Marcus