访问内部回调的回调参数

我正在尝试理解此代码。


let a = [1, 2, 3, 4, 5];


a.forEach(i => {

  setTimeout(i => {

    console.log(i);

  }, 1000);

});

为什么它给出如下输出:

5 times: undefined

我知道javascript异步执行代码和调度setTimeout功能,当迭代停止时,的最后一个值i是不确定的,但为什么是不确定的。
难道在javascript我们无法访问外回调参数的范围是什么?


Qyouu
浏览 138回答 3
3回答

森栏

那只是标准阴影。考虑以下代码: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无论如何,不会将任何有用的参数传递给回调。

守着一只汪

只是删除了i在setTimeoutlet a = [1,2,3,4,5];a.forEach((i) => {    setTimeout(() => {        console.log(i);    }, 1000);});

qq_笑_17

您的内部回调函数有一个名为的参数i,它会遮盖外部变量i。setTimeout()不会将任何参数传递到其回调,因此内部i为undefined。要使用外部回调中的参数或变量,只需使用它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript