Javascript 中 let 变量的块作用域

问题描述 投票:0回答:2

我试图理解 JavaScript 中 ES6 类型的变量作用域。 我注意到当我尝试访问块范围之外的

let
变量时没有错误(但应该有引用错误)。

我尝试运行以下程序。

<!DOCTYPE html>
<html>
<body>
    <h2 style="color:blue">edureka!</h2>
    <script>
    
    function func2()
    {
    
    {
        var fruit1 = 'orange';       //exist in function scope
        const fruit2 = 'banana';     //exist in block scope
        let fruit3 = 'grapes';       //exist in block scope

    }
    console.log(fruit1); //Accessible here
    console.log(fruit2); //Not Accessible here
    console.log(fruit3); //Not Accessible here
    
    
    }
    func2();
    
    </script>
</body>
</html>

我使用 VS Code Live Server 扩展来显示输出。 我得到的输出如下: Output as on chrome

如果我访问

console.log(fruit1);
。它会给出橙色的正确输出,并且不会出现错误,因为块作用域对于
var
无效。 当我尝试访问块范围之外的
console.log(fruit2);
时,出现引用错误。

现在问题: 当我尝试访问

console.log(fruit3);
时,没有显示错误。但应该会显示参考错误,因为它显示的是
console.log(fruit2);
.

我的代码有什么错误吗?这里到底发生了什么?

javascript variables ecmascript-6 scope constants
2个回答
0
投票

综上所述,

var
的这种行为就是在调用Hoisting

var
声明,无论它们出现在脚本中的什么位置,都会在执行脚本中的任何代码之前进行处理。在代码中的任何位置声明变量相当于在顶部声明它。这也意味着变量可以在声明之前就已被使用。


-1
投票

根据您的描述和提供的代码,您正在尝试了解 JavaScript 中

var
let
const
的作用域规则,特别是在块作用域的上下文中。您描述的行为表明
let
变量 (
fruit3
) 可以在其块作用域之外意外访问,这与 JavaScript 中
let
的预期行为相矛盾。

JavaScript 中的

let
const
声明都是块作用域的,这意味着它们只能在声明它们的块 (
{ ... }
) 内访问。这与
var
形成对比,后者是函数作用域的,这意味着它可以在声明它的整个函数中访问,无论块作用域如何。

鉴于这种理解,当尝试访问块范围之外的

fruit2
fruit3
时,您的代码确实应该抛出 ReferenceError,而
fruit1
应该可以访问,因为它是用
var
声明的。

以下是应该发生的情况的详细说明:

  • console.log(fruit1);
    应输出“橙色”,因为
    fruit1
    是用
    var
    声明的并且是函数范围的。
  • console.log(fruit2);
    应该抛出一个 ReferenceError 因为
    fruit2
    是块范围的(用
    const
    声明)并且你试图在其块之外访问它。
  • console.log(fruit3);
    也应该抛出一个 ReferenceError ,原因与
    fruit2
    相同,因为它是用
    let
    声明的并且是块作用域的。

如果

console.log(fruit3);
在您的环境中没有抛出 ReferenceError,则表明环境或代码执行方式可能存在问题。可能的原因可能包括:

  1. 缓存问题:浏览器或开发环境(如 VS Code Live Server)可能正在缓存旧版本的脚本。尝试清除缓存或重新启动服务器。

  2. 代码未更新:确保您正在编辑的代码是服务器正在提供的代码。

  3. 特定于环境的行为:不同的 JavaScript 环境(浏览器、Node.js 等)可能会有稍微不同的行为,尤其是在它们不完全符合 ECMAScript 标准的情况下。尝试在不同的浏览器或环境中运行您的代码,看看行为是否发生变化。

  4. 扩展或插件:有时,开发环境或浏览器中的扩展或插件可能会干扰代码的执行。尝试禁用它们,看看是否会影响结果。

为了进一步诊断问题,您可能希望通过直接在浏览器控制台中运行 JavaScript 代码或使用在线 JavaScript 游乐场来简化设置,以查看问题是否仍然存在。这可以帮助将问题隔离到您的代码或开发环境。

© www.soinside.com 2019 - 2024. All rights reserved.