为什么尽管存在全球范围范围的变量,为什么执行在第一个控制台日志失败?
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>在此处进行有关此事的更多阅读