为什么 JS 运行时不考虑全局范围?

问题描述

我正在尝试理解提升概念,如果我使用 var 而不是 constlet代码可以正常工作,但是当我使用 const 或 { {1}} 它抛出错误我有点困惑为什么 JS 运行时如果在本地范围内找不到,为什么不查看全局范围。

let

解决方法

使用 var 声明的变量是在执行任何代码之前创建的,并分配有未定义的初始值。此过程称为托管。

用 var 声明的变量的范围将在当前执行上下文和闭包内。这可能是封闭函数和在其中声明的函数,也可能是在任何函数外全局声明的变量。使用 var 重复变量名不会抛出错误,即使在严格模式下,变量也不会丢失其值,除非执行另一次赋值。

 var name = "Abc";
 function logName() {
      console.log('1. Name is => ',name); // Abc
      var name = "Grapes";
      console.log('2. Name is => ',name); // Grapes
 }

logName();

变量nameglobalThis为界,而函数logName()内的变量name是有界的使用 logName 函数。

var name = "Abc";
globalThis.hasOwnProperty("name") // true

所有声明(function、var、let、const 和 class)都在 JavaScript 中提升,而 var 声明使用 undefined 进行初始化,但 let 和 const 声明保持未初始化。

使用 const 或 let 声明的变量只有在 JavaScript 引擎在运行时评估其词法绑定(赋值)时才会被初始化。这意味着在引擎在源代码中声明的位置评估其值之前,您无法访问该变量。这就是我们所说的“临时死区”,即变量创建和初始化之间的时间跨度,它们无法被访问。

如果 JavaScript 引擎仍然无法在声明它们的行找到 let 或 const 变量的值,它将为它们分配 undefined 值或返回错误(在 const 的情况下)。

console.log(name); // ReferenceError: a is not defined
let name;
console.log(name); //undefined
name = "test";
console.log(name); //test

这是当函数 logName 被调用时,console.log(name) 将被执行并在本地执行上下文中查找变量 name。当在本地执行上下文中找不到它时,它会向外寻找变量 name,它将在 globalThis 内,因此在使用声明变量时,它会打印 Abc var 而不是使用 constlet 声明时。

,

“常量是块作用域的,很像使用 let 关键字声明的变量。常量的值不能通过重新赋值来改变,也不能重新声明。”

检查 -> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const