es5的 var 和 es6 的 let 区别

发布于 2022-09-04 00:41:39 字数 442 浏览 16 评论 0

for (let i=1;i<=5;i++) {
    setTimeout(function(){console.log(i)},i*1000);
}

这样就打印1,2,3,4,5

for (var i=1;i<=5;i++) {
    setTimeout(function(){console.log(i)},i*1000);
}

这样就打印5个6。为什么呢?

我的理解,es6的 let 是区域作用域变量,所以每循环一次就是一个独立的作用域,所以5个setTimeout里的i值是相互独立的。

而es5的 var是根据函数范围来区分作用域,循环的区域不是一个单独的作用域,所以一直都是同一个i,当setTimeout开始执行的时候,for循环已经结束了,所以会打印5个6。
不知道我这样理解对不对?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

佼人 2022-09-11 00:41:39

自己总结的关于es6的let和const特性:
let命令定义变量有如下特点
(1)变量仅在块级作用域内有效,并且在块级作用域内独立,不受外界影响
(2)变量必须先定义后使用,并且在js预编译时不存在变量提升
(3)变量读取仍然按照作用域链往上查找
(4)不可在同一作用域内重复定义变量
(5)在全局使用let定义变量时,该变量不再属于全局属性。
const命令用于定义常量,一旦赋值完成,则不可再变。其他特性跟let变量一样。
let,const定义变量,消除了使用var定义变量时带来的种种意外情况与不合理情况,使得变量的定义变得清晰可控,有了let与const,则不该再使用var定义变量。
另外在let,const的选择上,const的效率更高,因此,当程序中的变量一旦初始化则不会再改变时,此时使用const更加合理。
当变量需要重复赋值时,则选择let。

夜还是长夜 2022-09-11 00:41:39

对,函数作用域 => 块级作用域。

吾性傲以野 2022-09-11 00:41:39

送你一个链接,拿走不谢ECMAScript 6入门-let

娇妻 2022-09-11 00:41:39

理解的很对,var是以函数为作用域的,而let是以块为作用域的(与大多数高级语言相同)。所以ES6的这些特性正说明js逐渐向传统高级语言靠拢,提供严格明确的语言定义,便于开发大团队协作和构建更大规模的应用。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文