我正在尝试理解此代码。
let a = [1, 2, 3, 4, 5];
a.forEach(i => {
setTimeout(i => {
console.log(i);
}, 1000);
});
为什么给这样的输出:
5 times: undefined
我知道javascript
异步执行代码并调度setTimeout
函数,当迭代停止时,i
的最后一个值是不确定的,但为什么未定义。
在javascript
中我们无法访问外部回调参数的范围吗?
答案 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
不会将任何参数传递到其回调,因此内部i
是i
。
要使用外部回调中的参数或变量,只需使用它即可。
答案 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
,以防止访问。要解决此问题,只需删除内部的i
。 setTimeout
不会将任何有用的参数传递给回调。
答案 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);
});