【问题标题】:Why JS runtime not looking into Global scope? [duplicate]为什么 JS 运行时不考虑全局范围? [复制]
【发布时间】:2020-12-25 14:09:31
【问题描述】:

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

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

【问题讨论】:

  • 你可以使用this.name在你的函数中调用全局声明的name变量
  • 这是由于它的内部块作用域,如果您删除第二个 const 声明,它将起作用。 (但是,您根本不应该重新分配 const 变量,它们应该是 let )。您可以在官方文档中阅读更多相关信息。
  • 阅读:freecodecamp.org/news/what-is-the-temporal-dead-zone 简短的回答是:因为 letconst 就是按照规范设计的。
  • 理解“提升”的最好方法是忽略“提升”这个词和 99% 的关于提升的文章,看看 javascript 解释器的编译和执行/评估阶段。请参阅我对这个老问题的回答:stackoverflow.com/questions/3887408/…

标签: javascript scope hoisting


【解决方案1】:

使用 var 声明的变量在执行任何代码之前创建并分配初始值 undefined。这个过程称为托管。

用 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 声明时。

【讨论】:

  • Anto Richard 和 slebetman 的回答帮助我理解了这个概念,非常感谢。
【解决方案2】:

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

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

【讨论】:

  • OPs 代码中没有重新赋值或重新声明。
猜你喜欢
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2012-08-29
  • 2011-09-06
相关资源
最近更新 更多