访问内部回调的回调参数

时间:2019-05-10 15:18:23

标签: javascript

我正在尝试理解此代码。

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

a.forEach(i => {
  setTimeout(i => {
    console.log(i);
  }, 1000);
});

为什么给这样的输出:

5 times: undefined

我知道javascript异步执行代码并调度setTimeout函数,当迭代停止时,i的最后一个值是不确定的,但为什么未定义。
javascript中我们无法访问外部回调参数的范围吗?

4 个答案:

答案 0 :(得分:4)

只需删除i中的setTimeout

let a = [1,2,3,4,5];
a.forEach((i) => {
    setTimeout(() => {
        console.log(i);
    }, 1000);
});

答案 1 :(得分:3)

您的内部回调具有名为as的参数,该参数遮盖了外部git remote set-url origin "git repository url.git

git push -u origin your_branch不会将任何参数传递到其回调,因此内部ii

要使用外部回调中的参数或变量,只需使用它即可。

答案 2 :(得分: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,以防止访问。要解决此问题,只需删除内部的isetTimeout不会将任何有用的参数传递给回调。

答案 3 :(得分:3)

另一个选择是使用setTimeout的第三个参数。在delay之后添加的所有参数将作为参数传递给setTimeout内的函数

这是syntax

setTimeout(func[, delay, param1, param2, ...])

在这里,param1, param2等作为参数传递到func

let a = [1, 2, 3, 4, 5];
a.forEach(i => {
  setTimeout(value => {
    console.log(value);
  }, 1000, i);
});

如果您具有单独定义的函数并且无法通过i回调的forEach进行闭合操作,这将非常有用

function callback(value) {
  console.log(value)
}

let a = [1, 2, 3, 4, 5];
a.forEach(i => {
  setTimeout(callback, 1000, i);
});