Javascript Java脚本作用域

Javascript Java脚本作用域,javascript,Javascript,Js社区我是Js新手,在这个例子中我对Js作用域有一个混淆,我有一个if语句,我在block var age中定义了,这是一个局部作用域,然后我控制台记录了这个变量age,我得到了25,这是为什么?是否因为if语句是全局定义的,所以块内定义的也是全局的?还有一件事我注意到年龄变量被附加到全局对象上,这是我记录的窗口,我找到了年龄变量,但我不确定为什么会发生这种情况 if(true){ var age = 25; } console.log(age); 如果我理解正确,这是由于一个称为

Js社区我是Js新手,在这个例子中我对Js作用域有一个混淆,我有一个if语句,我在block var age中定义了,这是一个局部作用域,然后我控制台记录了这个变量age,我得到了25,这是为什么?是否因为if语句是全局定义的,所以块内定义的也是全局的?还有一件事我注意到年龄变量被附加到全局对象上,这是我记录的窗口,我找到了年龄变量,但我不确定为什么会发生这种情况

if(true){
    var age = 25;
}

console.log(age);

如果我理解正确,这是由于一个称为提升的概念,变量声明被移动到当前函数范围的顶部,而不是块范围


您有一些误解需要解决:

吊起 var吊装至局部范围(评估前)

let和const是词法作用域:

{ // this is a block scope, and will only be a scope when evaluated since it is standalone
    console.log(a) // reference error
    let a = 25;
    console.log(a) // 25
}
console.log(a) // reference error
显示语句块发生的情况

if (true) {
  let a = 25;
}
console.log(a) // reference error
控制语句 仅当计算结果为true时,才会执行if语句。真的是真的。因此,在示例中,if语句将始终激发,并将highed变量设置为25

你该怎么想

对于现代JS,尽量避免使用
var
。。。由于功能范围,您在这里期望的是块范围,。。在这里,您可以使用
let
const
。var的可能副本被提升到本地范围(在评估之前)如果变量被提升到局部范围,为什么年龄变量被附加到全局范围,它是如何工作的,并在语句块中给我值,我不是在寻找解决方案,我有一个困惑,我想了解为什么如果我定义了一个局部变量,它可以被全局访问,希望你能理解,我感谢你的解释简单地说,if语句块中的年龄变量是局部的还是全局的?局部的,因为这不是在函数内部定义的与Global AHA相同,所以我现在可以简单地说,如果函数之外的语句JS把它看作一个全局块,那么在里面写的是全局的,除了关键字,这取决于它的宿主行为是什么和如何定义的。让我们像前面描述的那样,在阻塞之后进行清理
if (true) {
  let a = 25;
}
console.log(a) // reference error
console.log(a) // undefined since a got hoisted to top of local scope, which is currently global
var a;
if (false) a = 25;
console.log(a) // undefined
if (true) a = 25;
console.log(a) // 25