javascript - 箭头函数中的 `var` 和 `let` 行为

标签 javascript

<分区>

为什么 i 在箭头函数中表现不同?是因为 var x 被重新分配,而 let x 正在为每次迭代创建新的吗?

//prints 55555
for(var x = 0; x < 5;x++){
    setTimeout(()=>console.log(x),0);
}

//prints 01234
for(let x = 0;x < 5;x++){
    setTimeout(()=>console.log(x),0);
}

最佳答案

它与箭头函数无关。 let 是 block 级作用域,所以每次进入循环体时,都会得到一个新变量。

在您的例子中,计时器函数的打印方式不同,因为闭包是围绕 x 创建的。

var 提供一个变量,循环的所有迭代(因此,所有计时器回调)共享,因此您可以获得每个计时器回调共享的变量的最后一个值。请记住,在循环结束之前,定时器回调不会运行,此时 x 已递增到 5。

let 为每个计时器回调赋予它自己的值,因为 block 作用域。因此,即使定时器回调直到循环结束才运行,每个回调都有一个围绕不同范围变量的闭包。

关于javascript - 箭头函数中的 `var` 和 `let` 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703512/

相关文章:

javascript - 如何编写 Jest 测试脚本来检查常量的值

javascript - Angular 8/Firebase : how do I set the displayName when creating user with email and password?

javascript - 停止一个连续被调用的函数

javascript - 使用 react-testing-library 时如何测试组件是否使用正确的 props 渲染?

php - php 中的 "->"是否与 javascript 中的 "."相似(也称为等效)?

javascript - 在调整大小时重新创建 D3 多线图表(响应式)

javascript - 将 requirejs 与 retinajs 一起使用

javascript - 易于编程的 WebSocket 服务器

javascript - Swift - 在 WebView 中禁用链接

javascript - React Router browserHistory.push 在新标签页中打开链接