我正在尝试理解此代码。let a = [1, 2, 3, 4, 5];a.forEach(i => { setTimeout(i => { console.log(i); }, 1000);});为什么它给出如下输出:5 times: undefined我知道javascript异步执行代码和调度setTimeout功能,当迭代停止时,的最后一个值i是不确定的,但为什么是不确定的。难道在javascript我们无法访问外回调参数的范围是什么?
3 回答
森栏
TA贡献1810条经验 获得超5个赞
那只是标准阴影。
考虑以下代码:
let x = "outer";
console.log(x);
{
let x = "inner";
console.log(x);
}
console.log(x);
内部块无法访问外部块,x
因为它已声明了同名的局部变量。
同样,在您的代码中有两个变量称为i
:
a.forEach(i => { setTimeout(i => {
唯一的区别是它们是函数参数,而不是用声明let
。除此之外,它们以相同的方式工作:内部i
遮蔽外部i
,防止访问。要解决此问题,只需移除inner即可i
。setTimeout
无论如何,不会将任何有用的参数传递给回调。
守着一只汪
TA贡献1872条经验 获得超3个赞
只是删除了i在setTimeout
let a = [1,2,3,4,5];
a.forEach((i) => {
setTimeout(() => {
console.log(i);
}, 1000);
});
qq_笑_17
TA贡献1818条经验 获得超7个赞
您的内部回调函数有一个名为的参数i
,它会遮盖外部变量i
。
setTimeout()
不会将任何参数传递到其回调,因此内部i
为undefined
。
要使用外部回调中的参数或变量,只需使用它。
添加回答
举报
0/150
提交
取消