全球范围可变,但为什么功能无法访问



为什么尽管存在全球范围范围的变量,为什么执行在第一个控制台日志失败?

const message = 'starts with mssg #1'; //Global scope
function scopeTest() {
  console.log('1. test #1: ', message); // <-- why unable to read Global scope here?
  const message = 'changed to mssg #2';
  console.log('2. test #2: ', message);
  if (true) { //Code block is OK
    const message = 'changed to mssg #3';
    console.log('3. test #3: ', message);
  }
  { //Another code block is OK
    const message = 'changed to mssg #4';
    console.log('4. test #4: ', message);
  }
  console.log('5. test last: ', message);
}
scopeTest();

不需要替代编码解决方案。只是想了解为什么JS无法在此特定函数的开头访问全局变量

请照亮。谢谢

,因为scopeTest内部对message的任何引用都将参考在message变量声明的最近范围,也就是说,在此处的scopeTest函数中。在您尝试引用它时, message已被识别为函数内部范围内的变量名称(也就是说,当您引用它时,您正在引用本地变量,而不是全局变量),但是局部变量尚未初始化 - 解释器尚未跨const message =行运行,因此在非军事区或时间死区域中的message变量 - 尝试在初始化之前将其引用将结果将其引用在未定义的错误中。

如果您从scopeTest内部删除const message(以便message变量名称的引用将参考全局变量),或将const message移动到上面的 test #1(以便在时间初始初始化您尝试记录它),它将按预期工作:

const message = 'starts with mssg #1'; //Global scope
function scopeTest() {
  const message = 'changed to mssg #2';
  console.log('1. test #1: ', message);
}
scopeTest();

const message = 'starts with mssg #1'; //Global scope
function scopeTest() {
  console.log('1. test #1: ', message);
}
scopeTest();

javaScript中的变量是在声明时huisisted 。这意味着,即使您在代码中以后声明它们,它们仍然可以在较早的呼叫中访问:就像声明(不是值的分配!)都会写在您的块的第一行中。'宣布了。

在您的代码中,您已在功能正文中声明了您的 message变量,因此它试图访问是因为悬挂而不是在全局范围中声明的。p>在此处进行有关此事的更多阅读

相关内容

  • 没有找到相关文章