javascript - Double let 声明:让提升如何在 for 循环中工作?
问题描述
给定以下简化代码,为什么会出现 ReferenceError?
function foo(n){
for (let i = 0; i < n; i++) {
console.log(i);
let i = 10;
}
}
foo(4);
// OUTPUT: ReferenceError: i is not defined
let
变量应该被提升为所有其他类型的声明。因此,在此代码i
中声明了两次。首先,在初始化关闭中,其次在 for 循环本身中。
为什么这个输出i is not defined
而不是 Identifier 'i' has already been declared
.
JS如何读取上面的代码?
解决方案
let
变量应该被提升为所有其他类型的声明。
let
与变量、函数和类声明不同,变量不会被提升。变量是一样的。var
const
在到达声明它的行之前,该变量不会存在。
但是,在到达声明之前,您无法访问相关范围内的变量。这有点无益,被称为时间死区。(有用的 2ality 博客)
这很有帮助,因为在声明变量之前访问它几乎总是一个错误。或者,至少,它是令人困惑的,并且会在你重构时导致错误。
function foo(n){
for (let i = 0; i < n; i++) {
// i cannot be accessed
let i = 10;
// i is set to 10
}
}
foo(4);
至于为什么它不是“标识符已声明”错误,for
循环头中声明的变量的范围是块中声明的变量的单独变量。这段代码基本上有 3 个作用域:外部的作用域,从for
循环头开始的作用域,以及从被 . 包围的块开始的作用域{}
。
推荐阅读
- angularjs - 为什么我得到“$http:badreq”?AngularJS $http 方法和 Zend 3 AbstractRestfulController 类
- wordpress - 如何在 wordpress 的自定义生成的古腾堡块中添加所见即所得的编辑器
- url - 如何在 Twisted 框架中获取两个路径变量?
- gcc - Asan : asan 库加载问题
- flutter - 我应该编写哪种布局结构来匹配我的应用程序设计
- transform - VTK:在多数据中变换表面
- swift - 与 React 相比,SwiftUI 的逻辑在哪里?
- python-3.x - 修复子图大小而不是从主图大小派生
- python - 从 deepdiff 输出中提取值?
- .net - 在 .NET Core 2.2 上找不到 AddHealthChecks().AddUrlGroup()