乐闻世界logo
搜索文章和话题

let 块作用域是怎么实现的?

浏览12
6月24日 16:43

let 关键字在JavaScript中被引入是为了提供块作用域(block scope)的功能。块作用域意味着由 let 声明的变量仅在声明它们的代码块内部是可见的。代码块是被花括号 {} 包围的一段代码,例如在 if 语句、forwhile 循环以及函数定义中都会用到代码块。

在ES6之前,JavaScript主要依赖的是函数作用域(function scope),由 var 关键字声明的变量要么是全局的,要么是在函数内部局部的。这种设计有时会导致意料之外的问题,特别是在循环中。

下面是一个使用 let 的例子来说明块作用域是如何工作的:

javascript
function runLoop() { for (let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 100 * i); } } runLoop();

在这个例子中,变量 i 是用 letfor 循环的块中声明的。这意味着每次循环迭代时,变量 i 都是一个新的变量,并且它被限制在这个循环的块作用域中。所以当 setTimeout 的回调函数执行时,它能够访问到循环迭代时对应的 i 的值。

如果我们用 var 替换掉 let,结果将会不同:

javascript
function runLoop() { for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 100 * i); } } runLoop();

在这个例子中,由于 var 声明的变量 i 是函数作用域的,当 setTimeout 的回调函数执行时,它会打印出循环结束后变量 i 的最终值,即5,会打印五次5,而不是0到4。

总结来说,let 关键字允许开发者在更细粒度的级别控制变量的作用域。这样做提高了代码的可读性和可维护性,并且减少了由于作用域导致的常见错误。

标签:前端ES6