首页 > 解决方案 > 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如何读取上面的代码?

标签: javascriptfor-loophoisting

解决方案


let变量应该被提升为所有其他类型的声明。

let与变量、函数和类声明不同,变量不会被提升。变量是一样的。varconst

在到达声明它的行之前,该变量不会存在。

但是,在到达声明之前,您无法访问相关范围内的变量。这有点无益,被称为时间死区。(有用的 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循环头开始的作用域,以及从被 . 包围的块开始的作用域{}


推荐阅读