var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6 解析这段代码
时间: 2024-06-06 16:06:04 浏览: 7
这段代码使用循环创建了一个包含10个函数的数组`a`,每个函数都会打印变量`i`的值。因为使用了`let`关键字声明循环变量`i`,所以每次循环都会创建一个新的作用域,每个函数都会捕获到不同的`i`值。
当调用`a[6]()`时,会执行第7个函数,并且它捕获的是循环中`i`为6的那个值,因此会输出`6`。
相关问题
for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000*i) }
这段代码会输出以下内容:
5
5
5
5
5
这是因为在循环中的setTimeout函数是异步的,它会在循环结束后才执行。因此,当函数执行时,变量i已经被循环到了5,所以会输出5五次。
为了解决这个问题,可以使用闭包来保留变量i的值,或者使用let关键字将变量i声明为块级作用域。例如:
// 使用闭包
for (var i = 0; i < 5; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1000*i)
})(i);
}
// 使用let
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000*i)
}
for (var i= 0;i< 5; i++){ setTimeout(function() {console.log(i) },1000*i)}
这段代码的输出结果并不是我们期望的 0,1,2,3,4,而是 5,5,5,5,5。原因是在 for 循环中使用了 var 关键字,它会将变量 i 绑定到函数作用域,而不是循环体作用域。因此,当 setTimeout 函数执行时,循环已经结束,i 的值变成了 5。要解决这个问题,可以使用 let 关键字来将 i 绑定到循环体作用域。示例代码如下:
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000 * i);
}
这样就可以得到我们期望的输出结果了。