let
关键字在JavaScript中被引入是为了提供块作用域(block scope)的功能。块作用域意味着由 let
声明的变量仅在声明它们的代码块内部是可见的。代码块是被花括号 {}
包围的一段代码,例如在 if
语句、for
和 while
循环以及函数定义中都会用到代码块。
在ES6之前,JavaScript主要依赖的是函数作用域(function scope),由 var
关键字声明的变量要么是全局的,要么是在函数内部局部的。这种设计有时会导致意料之外的问题,特别是在循环中。
下面是一个使用 let
的例子来说明块作用域是如何工作的:
javascriptfunction runLoop() { for (let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 100 * i); } } runLoop();
在这个例子中,变量 i
是用 let
在 for
循环的块中声明的。这意味着每次循环迭代时,变量 i
都是一个新的变量,并且它被限制在这个循环的块作用域中。所以当 setTimeout
的回调函数执行时,它能够访问到循环迭代时对应的 i
的值。
如果我们用 var
替换掉 let
,结果将会不同:
javascriptfunction 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
关键字允许开发者在更细粒度的级别控制变量的作用域。这样做提高了代码的可读性和可维护性,并且减少了由于作用域导致的常见错误。