JavaScript开发者中常见的混乱来源(也是常见的错误来源)是假设JavaScript为每个代码块创建一个新的作用域。尽管这在许多其他语言中是对的,但在JavaScript中却不是。考虑一下下面的代码:
for (var i = 0; i < 10; i++) { /* ... */ } console.log(i); // 输出什么?(
如果你猜测console.log()的调用会输出 undefined 或者抛出一个错误,那你就猜错了。答案是输出10。为什么呢?
在大多数其他语言中,上面的代码会导致一个错误,因为变量i的 "生命"(即使作用域)会被限制在for块中。但在JavaScript中,情况并非如此,即使在for循环完成后,变量i仍然在作用域内,在退出循环后仍保留其最后的值。(顺便说一下,这种行为被称为变量提升(variable hoisting)。
JavaScript中对块级作用域的支持是通过let关键字实现的。Let关键字已经被浏览器和Node.js等后端JavaScript引擎广泛支持了多年。